@testgorilla/tgo-ui 12.2.0 → 12.3.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.
Files changed (62) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +3 -0
  2. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +3 -0
  4. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +3 -0
  6. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +3 -0
  8. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +19 -4
  10. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +3 -0
  12. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +11 -1
  14. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +6 -0
  16. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +3 -0
  18. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +3 -0
  20. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +3 -0
  22. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +3 -0
  24. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +3 -0
  26. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +3 -0
  28. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +3 -0
  30. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +6 -0
  32. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +3 -0
  34. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +3 -0
  36. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +250 -50
  38. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +4 -0
  40. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +3 -0
  42. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +3 -0
  44. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +89 -7
  46. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +3 -0
  48. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +3 -0
  50. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +3 -0
  52. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  53. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +3 -0
  54. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  55. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +3 -0
  56. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  57. package/mcp/catalog.json +1 -1
  58. package/package.json +1 -1
  59. package/types/testgorilla-tgo-ui-components-button.d.ts +32 -0
  60. package/types/testgorilla-tgo-ui-components-core.d.ts +1 -0
  61. package/types/testgorilla-tgo-ui-components-popover.d.ts +51 -5
  62. package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +59 -1
@@ -1,8 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Directive, ElementRef, HostListener, Injectable, Injector, NgZone, inject, input, signal } from "@angular/core";
1
3
  import { Overlay } from "@angular/cdk/overlay";
2
4
  import { ComponentPortal } from "@angular/cdk/portal";
3
- import * as i0 from "@angular/core";
4
- import { ChangeDetectionStrategy, Component, Directive, ElementRef, HostListener, Injector, NgZone, inject, input, signal } from "@angular/core";
5
- import { Subscription } from "rxjs";
5
+ import { Subject, Subscription } from "rxjs";
6
6
  import { CdkTrapFocus } from "@angular/cdk/a11y";
7
7
  import { NgTemplateOutlet } from "@angular/common";
8
8
  import * as i1 from "@testgorilla/tgo-ui/components/card";
@@ -14,8 +14,12 @@ var PopoverComponent = class PopoverComponent {
14
14
  this.popoverCard = input(true, ...ngDevMode ? [{ debugName: "popoverCard" }] : /* istanbul ignore next */ []);
15
15
  this.popoverCardSize = input("medium", ...ngDevMode ? [{ debugName: "popoverCardSize" }] : /* istanbul ignore next */ []);
16
16
  this.trapFocus = input(false, ...ngDevMode ? [{ debugName: "trapFocus" }] : /* istanbul ignore next */ []);
17
+ this.restoreFocusTo = input(null, ...ngDevMode ? [{ debugName: "restoreFocusTo" }] : /* istanbul ignore next */ []);
17
18
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
18
19
  }
20
+ ngOnInit() {
21
+ this.restoreFocusTo()?.focus({ preventScroll: true });
22
+ }
19
23
  static {
20
24
  this.ɵfac = i0.ɵɵngDeclareFactory({
21
25
  minVersion: "12.0.0",
@@ -69,6 +73,13 @@ var PopoverComponent = class PopoverComponent {
69
73
  isRequired: false,
70
74
  transformFunction: null
71
75
  },
76
+ restoreFocusTo: {
77
+ classPropertyName: "restoreFocusTo",
78
+ publicName: "restoreFocusTo",
79
+ isSignal: true,
80
+ isRequired: false,
81
+ transformFunction: null
82
+ },
72
83
  ariaLabel: {
73
84
  classPropertyName: "ariaLabel",
74
85
  publicName: "ariaLabel",
@@ -186,6 +197,14 @@ i0.ɵɵngDeclareClassMetadata({
186
197
  required: false
187
198
  }]
188
199
  }],
200
+ restoreFocusTo: [{
201
+ type: i0.Input,
202
+ args: [{
203
+ isSignal: true,
204
+ alias: "restoreFocusTo",
205
+ required: false
206
+ }]
207
+ }],
189
208
  ariaLabel: [{
190
209
  type: i0.Input,
191
210
  args: [{
@@ -196,20 +215,119 @@ i0.ɵɵngDeclareClassMetadata({
196
215
  }]
197
216
  }
198
217
  });
218
+ const END_PLACEMENT_VIEWPORT_MARGIN = 16;
219
+ const popoverPositions = ({ placement, align, offset }) => placement === "end" ? [{
220
+ originX: "end",
221
+ originY: "top",
222
+ overlayX: "start",
223
+ overlayY: "top",
224
+ offsetX: offset
225
+ }, {
226
+ originX: "start",
227
+ originY: "top",
228
+ overlayX: "end",
229
+ overlayY: "top",
230
+ offsetX: -offset
231
+ }] : [{
232
+ originX: align,
233
+ originY: "bottom",
234
+ overlayX: align,
235
+ overlayY: "top",
236
+ offsetY: offset
237
+ }, {
238
+ originX: align,
239
+ originY: "top",
240
+ overlayX: align,
241
+ overlayY: "bottom",
242
+ offsetY: -offset
243
+ }];
244
+ var PopoverOverlayService = class PopoverOverlayService {
245
+ constructor() {
246
+ this.overlay = inject(Overlay);
247
+ }
248
+ create(anchor, config) {
249
+ const positionStrategy = this.overlay.position().flexibleConnectedTo(anchor).withPositions(popoverPositions(config)).withViewportMargin(config.placement === "end" ? END_PLACEMENT_VIEWPORT_MARGIN : 0);
250
+ return this.overlay.create({
251
+ positionStrategy,
252
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
253
+ hasBackdrop: false
254
+ });
255
+ }
256
+ attach(overlayRef, injector, template, close, options) {
257
+ const ref = overlayRef.attach(new ComponentPortal(PopoverComponent, null, injector));
258
+ ref.setInput("templateRef", template);
259
+ ref.setInput("ctx", { close });
260
+ ref.setInput("popoverCard", options.isCard);
261
+ ref.setInput("popoverCardSize", options.cardSize);
262
+ ref.setInput("trapFocus", options.trapFocus);
263
+ ref.setInput("restoreFocusTo", options.restoreFocusTo ?? null);
264
+ ref.setInput("ariaLabel", options.ariaLabel);
265
+ return ref;
266
+ }
267
+ dismissOnOutsideOrEscape(overlayRef, anchor, close) {
268
+ const subscriptions = new Subscription();
269
+ subscriptions.add(overlayRef.outsidePointerEvents().subscribe((event) => {
270
+ if (!anchor.contains(event.target)) close();
271
+ }));
272
+ subscriptions.add(overlayRef.keydownEvents().subscribe((event) => {
273
+ if (event.key !== "Escape") return;
274
+ event.preventDefault();
275
+ close();
276
+ }));
277
+ return subscriptions;
278
+ }
279
+ static {
280
+ this.ɵfac = i0.ɵɵngDeclareFactory({
281
+ minVersion: "12.0.0",
282
+ version: "22.2.4",
283
+ ngImport: i0,
284
+ type: PopoverOverlayService,
285
+ deps: [],
286
+ target: i0.ɵɵFactoryTarget.Injectable
287
+ });
288
+ }
289
+ static {
290
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
291
+ minVersion: "12.0.0",
292
+ version: "22.2.4",
293
+ ngImport: i0,
294
+ type: PopoverOverlayService,
295
+ providedIn: "root"
296
+ });
297
+ }
298
+ };
299
+ i0.ɵɵngDeclareClassMetadata({
300
+ minVersion: "12.0.0",
301
+ version: "22.2.4",
302
+ ngImport: i0,
303
+ type: PopoverOverlayService,
304
+ decorators: [{
305
+ type: Injectable,
306
+ args: [{ providedIn: "root" }]
307
+ }]
308
+ });
309
+ const POPOVER_DEFAULTS = {
310
+ placement: "below",
311
+ align: "center",
312
+ offset: 4,
313
+ isCard: true,
314
+ cardSize: "medium"
315
+ };
199
316
  var PopoverDirective = class PopoverDirective {
200
317
  constructor() {
201
318
  this.uiPopover = input.required(...ngDevMode ? [{ debugName: "uiPopover" }] : /* istanbul ignore next */ []);
202
- this.popoverOffset = input(4, ...ngDevMode ? [{ debugName: "popoverOffset" }] : /* istanbul ignore next */ []);
203
- this.popoverAlign = input("center", ...ngDevMode ? [{ debugName: "popoverAlign" }] : /* istanbul ignore next */ []);
319
+ this.popoverOffset = input(POPOVER_DEFAULTS.offset, ...ngDevMode ? [{ debugName: "popoverOffset" }] : /* istanbul ignore next */ []);
320
+ this.popoverAlign = input(POPOVER_DEFAULTS.align, ...ngDevMode ? [{ debugName: "popoverAlign" }] : /* istanbul ignore next */ []);
321
+ this.popoverPlacement = input(POPOVER_DEFAULTS.placement, ...ngDevMode ? [{ debugName: "popoverPlacement" }] : /* istanbul ignore next */ []);
204
322
  this.popoverOpen = input(false, ...ngDevMode ? [{ debugName: "popoverOpen" }] : /* istanbul ignore next */ []);
205
- this.popoverCard = input(true, ...ngDevMode ? [{ debugName: "popoverCard" }] : /* istanbul ignore next */ []);
206
- this.popoverCardSize = input("medium", ...ngDevMode ? [{ debugName: "popoverCardSize" }] : /* istanbul ignore next */ []);
323
+ this.popoverCard = input(POPOVER_DEFAULTS.isCard, ...ngDevMode ? [{ debugName: "popoverCard" }] : /* istanbul ignore next */ []);
324
+ this.popoverCardSize = input(POPOVER_DEFAULTS.cardSize, ...ngDevMode ? [{ debugName: "popoverCardSize" }] : /* istanbul ignore next */ []);
207
325
  this.popoverTrigger = input("hover", ...ngDevMode ? [{ debugName: "popoverTrigger" }] : /* istanbul ignore next */ []);
208
326
  this.popoverAriaLabel = input("", ...ngDevMode ? [{ debugName: "popoverAriaLabel" }] : /* istanbul ignore next */ []);
209
327
  this.uiPopoverDisabled = input(false, ...ngDevMode ? [{ debugName: "uiPopoverDisabled" }] : /* istanbul ignore next */ []);
210
328
  this.openState = signal(false, ...ngDevMode ? [{ debugName: "openState" }] : /* istanbul ignore next */ []);
211
329
  this.isOpen = this.openState.asReadonly();
212
- this.overlay = inject(Overlay);
330
+ this.popoverOverlay = inject(PopoverOverlayService);
213
331
  this.elementRef = inject(ElementRef);
214
332
  this.injector = inject(Injector);
215
333
  this.ngZone = inject(NgZone);
@@ -238,14 +356,10 @@ var PopoverDirective = class PopoverDirective {
238
356
  if (!this.overlayRef) this.createOverlay();
239
357
  const overlayRef = this.overlayRef;
240
358
  if (!overlayRef || overlayRef.hasAttached()) return;
241
- const portal = new ComponentPortal(PopoverComponent, null, this.injector);
242
- const ref = overlayRef.attach(portal);
243
- ref.setInput("templateRef", this.uiPopover());
244
- ref.setInput("ctx", { close: () => this.close() });
245
- ref.setInput("popoverCard", this.popoverCard());
246
- ref.setInput("popoverCardSize", this.popoverCardSize());
247
- ref.setInput("trapFocus", this.popoverTrigger() === "click");
248
- ref.setInput("ariaLabel", this.popoverAriaLabel());
359
+ this.popoverOverlay.attach(overlayRef, this.injector, this.uiPopover(), () => this.close(), {
360
+ ...this.config(),
361
+ trapFocus: this.popoverTrigger() === "click"
362
+ });
249
363
  if (this.popoverTrigger() === "hover") {
250
364
  const el = overlayRef.overlayElement;
251
365
  const enter = () => this.ngZone.run(() => this.cancelClose());
@@ -274,40 +388,19 @@ var PopoverDirective = class PopoverDirective {
274
388
  if (this.isOpen()) this.close();
275
389
  else this.open();
276
390
  }
277
- createOverlay() {
278
- const align = this.popoverAlign();
279
- const positionStrategy = this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{
280
- originX: align,
281
- originY: "bottom",
282
- overlayX: align,
283
- overlayY: "top",
284
- offsetY: this.popoverOffset()
285
- }, {
286
- originX: align,
287
- originY: "top",
288
- overlayX: align,
289
- overlayY: "bottom",
290
- offsetY: -this.popoverOffset()
291
- }]);
292
- this.overlayRef = this.overlay.create({
293
- positionStrategy,
294
- scrollStrategy: this.overlay.scrollStrategies.reposition(),
295
- hasBackdrop: false
296
- });
297
- if (this.popoverTrigger() === "click") this.listenForDismiss(this.overlayRef);
391
+ config() {
392
+ return {
393
+ placement: this.popoverPlacement(),
394
+ align: this.popoverAlign(),
395
+ offset: this.popoverOffset(),
396
+ isCard: this.popoverCard(),
397
+ cardSize: this.popoverCardSize(),
398
+ ariaLabel: this.popoverAriaLabel()
399
+ };
298
400
  }
299
- listenForDismiss(overlayRef) {
300
- const subscriptions = new Subscription();
301
- subscriptions.add(overlayRef.outsidePointerEvents().subscribe((event) => {
302
- if (this.elementRef.nativeElement.contains(event.target)) return;
303
- this.close();
304
- }));
305
- subscriptions.add(overlayRef.keydownEvents().subscribe((event) => {
306
- if (event.key !== "Escape") return;
307
- event.preventDefault();
308
- this.close();
309
- }));
310
- this.dismissSubscriptions = subscriptions;
401
+ createOverlay() {
402
+ this.overlayRef = this.popoverOverlay.create(this.elementRef, this.config());
403
+ if (this.popoverTrigger() === "click") this.dismissSubscriptions = this.popoverOverlay.dismissOnOutsideOrEscape(this.overlayRef, this.elementRef.nativeElement, () => this.close());
311
404
  }
312
405
  scheduleOpen() {
313
406
  this.openTimeout = setTimeout(() => this.open(), 100);
@@ -376,6 +469,13 @@ var PopoverDirective = class PopoverDirective {
376
469
  isRequired: false,
377
470
  transformFunction: null
378
471
  },
472
+ popoverPlacement: {
473
+ classPropertyName: "popoverPlacement",
474
+ publicName: "popoverPlacement",
475
+ isSignal: true,
476
+ isRequired: false,
477
+ transformFunction: null
478
+ },
379
479
  popoverOpen: {
380
480
  classPropertyName: "popoverOpen",
381
481
  publicName: "popoverOpen",
@@ -467,6 +567,14 @@ i0.ɵɵngDeclareClassMetadata({
467
567
  required: false
468
568
  }]
469
569
  }],
570
+ popoverPlacement: [{
571
+ type: i0.Input,
572
+ args: [{
573
+ isSignal: true,
574
+ alias: "popoverPlacement",
575
+ required: false
576
+ }]
577
+ }],
470
578
  popoverOpen: [{
471
579
  type: i0.Input,
472
580
  args: [{
@@ -529,6 +637,98 @@ i0.ɵɵngDeclareClassMetadata({
529
637
  }]
530
638
  }
531
639
  });
532
- export { PopoverDirective };
640
+ var PopoverRef = class {
641
+ constructor(anchor, overlayRef, destroyRef) {
642
+ this.anchor = anchor;
643
+ this.overlayRef = overlayRef;
644
+ this.openState = signal(true, ...ngDevMode ? [{ debugName: "openState" }] : /* istanbul ignore next */ []);
645
+ this.closedSubject$ = new Subject();
646
+ this.isOpen = this.openState.asReadonly();
647
+ this.closed$ = this.closedSubject$.asObservable();
648
+ this.stopClosingOnDestroy = destroyRef?.onDestroy(() => {
649
+ this.stopClosingOnDestroy = void 0;
650
+ this.close();
651
+ });
652
+ }
653
+ close() {
654
+ if (!this.openState()) return;
655
+ this.openState.set(false);
656
+ this.stopClosingOnDestroy?.();
657
+ this.overlayRef.dispose();
658
+ this.closedSubject$.next();
659
+ this.closedSubject$.complete();
660
+ }
661
+ };
662
+ var PopoverService = class PopoverService {
663
+ constructor() {
664
+ this.popoverOverlay = inject(PopoverOverlayService);
665
+ this.injector = inject(Injector);
666
+ this.active = null;
667
+ }
668
+ open(anchor, template, config = {}) {
669
+ const current = this.openRefFor(anchor);
670
+ if (current) return current;
671
+ this.active?.close();
672
+ const { destroyRef, ...popoverConfig } = config;
673
+ const resolved = {
674
+ ...POPOVER_DEFAULTS,
675
+ ariaLabel: "",
676
+ ...popoverConfig
677
+ };
678
+ const overlayRef = this.popoverOverlay.create(anchor, resolved);
679
+ const ref = new PopoverRef(anchor, overlayRef, destroyRef);
680
+ const close = () => ref.close();
681
+ this.popoverOverlay.attach(overlayRef, this.injector, template, close, {
682
+ ...resolved,
683
+ trapFocus: true,
684
+ restoreFocusTo: anchor
685
+ });
686
+ this.popoverOverlay.dismissOnOutsideOrEscape(overlayRef, anchor, close);
687
+ this.active = ref;
688
+ return ref;
689
+ }
690
+ toggle(anchor, template, config = {}) {
691
+ const current = this.openRefFor(anchor);
692
+ if (current) {
693
+ current.close();
694
+ return null;
695
+ }
696
+ return this.open(anchor, template, config);
697
+ }
698
+ openRefFor(anchor) {
699
+ const active = this.active;
700
+ return active?.anchor === anchor && active.isOpen() ? active : null;
701
+ }
702
+ static {
703
+ this.ɵfac = i0.ɵɵngDeclareFactory({
704
+ minVersion: "12.0.0",
705
+ version: "22.2.4",
706
+ ngImport: i0,
707
+ type: PopoverService,
708
+ deps: [],
709
+ target: i0.ɵɵFactoryTarget.Injectable
710
+ });
711
+ }
712
+ static {
713
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
714
+ minVersion: "12.0.0",
715
+ version: "22.2.4",
716
+ ngImport: i0,
717
+ type: PopoverService,
718
+ providedIn: "root"
719
+ });
720
+ }
721
+ };
722
+ i0.ɵɵngDeclareClassMetadata({
723
+ minVersion: "12.0.0",
724
+ version: "22.2.4",
725
+ ngImport: i0,
726
+ type: PopoverService,
727
+ decorators: [{
728
+ type: Injectable,
729
+ args: [{ providedIn: "root" }]
730
+ }]
731
+ });
732
+ export { PopoverDirective, PopoverRef, PopoverService };
533
733
 
534
734
  //# sourceMappingURL=testgorilla-tgo-ui-components-popover.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"testgorilla-tgo-ui-components-popover.mjs","names":[],"sources":["../../../components/popover/popover.component.ts","../../../components/popover/popover.component.html","../../../components/popover/popover.directive.ts"],"sourcesContent":["import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\n\nimport { CardComponentModule, CardSize } from '@testgorilla/tgo-ui/components/card';\n\n@Component({\n selector: 'ui-popover',\n standalone: true,\n imports: [NgTemplateOutlet, CardComponentModule, CdkTrapFocus],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverComponent {\n templateRef = input<TemplateRef<unknown> | null>(null);\n ctx = input<Record<string, unknown>>({});\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n trapFocus = input(false);\n ariaLabel = input('');\n}\n","@if (templateRef()) {\n <div class=\"popover-focus-scope\" [cdkTrapFocus]=\"trapFocus()\" [cdkTrapFocusAutoCapture]=\"trapFocus()\">\n <div\n class=\"popover-surface\"\n [attr.role]=\"trapFocus() ? 'dialog' : null\"\n [attr.aria-label]=\"trapFocus() && ariaLabel() ? ariaLabel() : null\"\n [attr.tabindex]=\"trapFocus() ? '-1' : null\"\n [attr.cdkFocusInitial]=\"trapFocus() ? '' : null\"\n >\n @if (popoverCard()) {\n <ui-card [size]=\"popoverCardSize()\">\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n </ui-card>\n } @else {\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n }\n </div>\n </div>\n}\n","import { HorizontalConnectionPos, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Directive,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { CardSize } from '@testgorilla/tgo-ui/components/card';\n\nimport { PopoverComponent } from './popover.component';\nimport { PopoverTrigger } from './popover.model';\n\n@Directive({\n selector: '[uiPopover]',\n exportAs: 'uiPopover',\n standalone: true,\n})\nexport class PopoverDirective implements OnInit, OnDestroy {\n uiPopover = input.required<TemplateRef<unknown>>();\n popoverOffset = input(4);\n popoverAlign = input<HorizontalConnectionPos>('center');\n popoverOpen = input(false);\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n popoverTrigger = input<PopoverTrigger>('hover');\n popoverAriaLabel = input('');\n uiPopoverDisabled = input(false);\n\n private readonly openState = signal(false);\n\n /** Whether the popover is currently showing. Read it via `#ref=\"uiPopover\"` or `viewChild(PopoverDirective)`. */\n readonly isOpen = this.openState.asReadonly();\n\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly ngZone = inject(NgZone);\n\n private overlayRef: OverlayRef | null = null;\n private openTimeout: ReturnType<typeof setTimeout> | null = null;\n private closeTimeout: ReturnType<typeof setTimeout> | null = null;\n private overlayListeners: { enter: () => void; leave: () => void } | null = null;\n private dismissSubscriptions: Subscription | null = null;\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.popoverTrigger() !== 'hover' || this.uiPopoverDisabled()) {\n return;\n }\n this.cancelClose();\n this.scheduleOpen();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.popoverTrigger() !== 'hover') {\n return;\n }\n this.cancelOpen();\n this.scheduleClose();\n }\n\n @HostListener('click')\n onClick(): void {\n if (this.popoverTrigger() !== 'click') {\n return;\n }\n this.toggle();\n }\n\n /** Opens the popover. No-op while `uiPopoverDisabled` is `true` or it is already open. */\n open(): void {\n if (this.uiPopoverDisabled()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.createOverlay();\n }\n\n const overlayRef = this.overlayRef;\n if (!overlayRef || overlayRef.hasAttached()) {\n return;\n }\n\n const portal = new ComponentPortal(PopoverComponent, null, this.injector);\n const ref = overlayRef.attach(portal);\n ref.setInput('templateRef', this.uiPopover());\n ref.setInput('ctx', { close: () => this.close() });\n ref.setInput('popoverCard', this.popoverCard());\n ref.setInput('popoverCardSize', this.popoverCardSize());\n ref.setInput('trapFocus', this.popoverTrigger() === 'click');\n ref.setInput('ariaLabel', this.popoverAriaLabel());\n\n if (this.popoverTrigger() === 'hover') {\n const el = overlayRef.overlayElement;\n const enter = (): void => this.ngZone.run(() => this.cancelClose());\n const leave = (): void => this.ngZone.run(() => this.scheduleClose());\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n this.overlayListeners = { enter, leave };\n }\n\n this.openState.set(true);\n }\n\n /** Closes the popover. Safe to call when it is already closed. */\n close(): void {\n if (!this.overlayRef) {\n return;\n }\n\n if (this.overlayListeners) {\n const el = this.overlayRef.overlayElement;\n el.removeEventListener('mouseenter', this.overlayListeners.enter);\n el.removeEventListener('mouseleave', this.overlayListeners.leave);\n this.overlayListeners = null;\n }\n\n this.overlayRef.detach();\n this.openState.set(false);\n }\n\n /** Opens the popover when closed, closes it when open. */\n toggle(): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private createOverlay(): void {\n const align = this.popoverAlign();\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions([\n { originX: align, originY: 'bottom', overlayX: align, overlayY: 'top', offsetY: this.popoverOffset() },\n { originX: align, originY: 'top', overlayX: align, overlayY: 'bottom', offsetY: -this.popoverOffset() },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n });\n\n if (this.popoverTrigger() === 'click') {\n this.listenForDismiss(this.overlayRef);\n }\n }\n\n /** Click-triggered popovers dismiss on an outside pointer event or on Escape. */\n private listenForDismiss(overlayRef: OverlayRef): void {\n const subscriptions = new Subscription();\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe(event => {\n // The anchor's own click handler toggles, so ignore it here to avoid closing and reopening.\n if (this.elementRef.nativeElement.contains(event.target as Node)) {\n return;\n }\n this.close();\n })\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n // cdkTrapFocusAutoCapture restores focus to whatever was focused before the popover opened,\n // so closing is all this has to do.\n this.close();\n })\n );\n\n this.dismissSubscriptions = subscriptions;\n }\n\n private scheduleOpen(): void {\n this.openTimeout = setTimeout(() => this.open(), 100);\n }\n\n private cancelOpen(): void {\n if (this.openTimeout) {\n clearTimeout(this.openTimeout);\n this.openTimeout = null;\n }\n }\n\n private scheduleClose(): void {\n this.closeTimeout = setTimeout(() => this.close(), 150);\n }\n\n private cancelClose(): void {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n ngOnInit(): void {\n if (this.popoverOpen()) {\n this.open();\n }\n }\n\n ngOnDestroy(): void {\n this.cancelOpen();\n this.cancelClose();\n this.close();\n this.dismissSubscriptions?.unsubscribe();\n this.overlayRef?.dispose();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testgorilla-tgo-ui-components-popover.mjs","names":[],"sources":["../../../components/popover/popover.component.ts","../../../components/popover/popover.component.html","../../../components/popover/popover-overlay.service.ts","../../../components/popover/popover.constants.ts","../../../components/popover/popover.directive.ts","../../../components/popover/popover.service.ts"],"sourcesContent":["import { CdkTrapFocus } from '@angular/cdk/a11y';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, OnInit, TemplateRef } from '@angular/core';\n\nimport { CardComponentModule, CardSize } from '@testgorilla/tgo-ui/components/card';\n\n@Component({\n selector: 'ui-popover',\n standalone: true,\n imports: [NgTemplateOutlet, CardComponentModule, CdkTrapFocus],\n templateUrl: './popover.component.html',\n styleUrls: ['./popover.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverComponent implements OnInit {\n templateRef = input<TemplateRef<unknown> | null>(null);\n ctx = input<Record<string, unknown>>({});\n popoverCard = input(true);\n popoverCardSize = input<CardSize>('medium');\n trapFocus = input(false);\n restoreFocusTo = input<HTMLElement | null>(null);\n ariaLabel = input('');\n\n ngOnInit(): void {\n // Runs before the focus trap captures the element to restore on close: Safari does not focus a button on click.\n this.restoreFocusTo()?.focus({ preventScroll: true });\n }\n}\n","@if (templateRef()) {\n <div class=\"popover-focus-scope\" [cdkTrapFocus]=\"trapFocus()\" [cdkTrapFocusAutoCapture]=\"trapFocus()\">\n <div\n class=\"popover-surface\"\n [attr.role]=\"trapFocus() ? 'dialog' : null\"\n [attr.aria-label]=\"trapFocus() && ariaLabel() ? ariaLabel() : null\"\n [attr.tabindex]=\"trapFocus() ? '-1' : null\"\n [attr.cdkFocusInitial]=\"trapFocus() ? '' : null\"\n >\n @if (popoverCard()) {\n <ui-card [size]=\"popoverCardSize()\">\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n </ui-card>\n } @else {\n <ng-container *ngTemplateOutlet=\"templateRef(); context: ctx()\"></ng-container>\n }\n </div>\n </div>\n}\n","import { ConnectedPosition, Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { ComponentRef, ElementRef, inject, Injectable, Injector, TemplateRef } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { PopoverComponent } from './popover.component';\nimport { PopoverConfig } from './popover.model';\n\nexport interface PopoverAttachOptions extends Required<PopoverConfig> {\n trapFocus: boolean;\n restoreFocusTo?: HTMLElement;\n}\n\nconst END_PLACEMENT_VIEWPORT_MARGIN = 16;\n\nconst popoverPositions = ({ placement, align, offset }: Required<PopoverConfig>): ConnectedPosition[] =>\n placement === 'end'\n ? [\n { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: offset },\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -offset },\n ]\n : [\n { originX: align, originY: 'bottom', overlayX: align, overlayY: 'top', offsetY: offset },\n { originX: align, originY: 'top', overlayX: align, overlayY: 'bottom', offsetY: -offset },\n ];\n\n@Injectable({ providedIn: 'root' })\nexport class PopoverOverlayService {\n private readonly overlay = inject(Overlay);\n\n create(anchor: HTMLElement | ElementRef<HTMLElement>, config: Required<PopoverConfig>): OverlayRef {\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(anchor)\n .withPositions(popoverPositions(config))\n .withViewportMargin(config.placement === 'end' ? END_PLACEMENT_VIEWPORT_MARGIN : 0);\n\n return this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n });\n }\n\n attach(\n overlayRef: OverlayRef,\n injector: Injector,\n template: TemplateRef<unknown>,\n close: () => void,\n options: PopoverAttachOptions\n ): ComponentRef<PopoverComponent> {\n const ref = overlayRef.attach(new ComponentPortal(PopoverComponent, null, injector));\n ref.setInput('templateRef', template);\n ref.setInput('ctx', { close });\n ref.setInput('popoverCard', options.isCard);\n ref.setInput('popoverCardSize', options.cardSize);\n ref.setInput('trapFocus', options.trapFocus);\n ref.setInput('restoreFocusTo', options.restoreFocusTo ?? null);\n ref.setInput('ariaLabel', options.ariaLabel);\n return ref;\n }\n\n dismissOnOutsideOrEscape(overlayRef: OverlayRef, anchor: HTMLElement, close: () => void): Subscription {\n const subscriptions = new Subscription();\n\n subscriptions.add(\n overlayRef.outsidePointerEvents().subscribe(event => {\n // The anchor's own click handler toggles, so ignore it here to avoid closing and reopening.\n if (!anchor.contains(event.target as Node)) {\n close();\n }\n })\n );\n\n subscriptions.add(\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key !== 'Escape') {\n return;\n }\n event.preventDefault();\n // cdkTrapFocusAutoCapture restores focus to whatever was focused before the popover opened,\n // so closing is all this has to do.\n close();\n })\n );\n\n return subscriptions;\n }\n}\n","import { PopoverConfig } from './popover.model';\n\nexport const POPOVER_DEFAULTS: Required<Omit<PopoverConfig, 'ariaLabel'>> = {\n placement: 'below',\n align: 'center',\n offset: 4,\n isCard: true,\n cardSize: 'medium',\n};\n","import { HorizontalConnectionPos, OverlayRef } from '@angular/cdk/overlay';\nimport {\n Directive,\n ElementRef,\n HostListener,\n inject,\n Injector,\n input,\n NgZone,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { CardSize } from '@testgorilla/tgo-ui/components/card';\n\nimport { PopoverOverlayService } from './popover-overlay.service';\nimport { POPOVER_DEFAULTS } from './popover.constants';\nimport { PopoverConfig, PopoverPlacement, PopoverTrigger } from './popover.model';\n\n@Directive({\n selector: '[uiPopover]',\n exportAs: 'uiPopover',\n standalone: true,\n})\nexport class PopoverDirective implements OnInit, OnDestroy {\n uiPopover = input.required<TemplateRef<unknown>>();\n popoverOffset = input(POPOVER_DEFAULTS.offset);\n popoverAlign = input<HorizontalConnectionPos>(POPOVER_DEFAULTS.align);\n popoverPlacement = input<PopoverPlacement>(POPOVER_DEFAULTS.placement);\n popoverOpen = input(false);\n popoverCard = input(POPOVER_DEFAULTS.isCard);\n popoverCardSize = input<CardSize>(POPOVER_DEFAULTS.cardSize);\n popoverTrigger = input<PopoverTrigger>('hover');\n popoverAriaLabel = input('');\n uiPopoverDisabled = input(false);\n\n private readonly openState = signal(false);\n\n /** Whether the popover is currently showing. Read it via `#ref=\"uiPopover\"` or `viewChild(PopoverDirective)`. */\n readonly isOpen = this.openState.asReadonly();\n\n private readonly popoverOverlay = inject(PopoverOverlayService);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly ngZone = inject(NgZone);\n\n private overlayRef: OverlayRef | null = null;\n private openTimeout: ReturnType<typeof setTimeout> | null = null;\n private closeTimeout: ReturnType<typeof setTimeout> | null = null;\n private overlayListeners: { enter: () => void; leave: () => void } | null = null;\n private dismissSubscriptions: Subscription | null = null;\n\n @HostListener('mouseenter')\n onMouseEnter(): void {\n if (this.popoverTrigger() !== 'hover' || this.uiPopoverDisabled()) {\n return;\n }\n this.cancelClose();\n this.scheduleOpen();\n }\n\n @HostListener('mouseleave')\n onMouseLeave(): void {\n if (this.popoverTrigger() !== 'hover') {\n return;\n }\n this.cancelOpen();\n this.scheduleClose();\n }\n\n @HostListener('click')\n onClick(): void {\n if (this.popoverTrigger() !== 'click') {\n return;\n }\n this.toggle();\n }\n\n /** Opens the popover. No-op while `uiPopoverDisabled` is `true` or it is already open. */\n open(): void {\n if (this.uiPopoverDisabled()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.createOverlay();\n }\n\n const overlayRef = this.overlayRef;\n if (!overlayRef || overlayRef.hasAttached()) {\n return;\n }\n\n this.popoverOverlay.attach(overlayRef, this.injector, this.uiPopover(), () => this.close(), {\n ...this.config(),\n trapFocus: this.popoverTrigger() === 'click',\n });\n\n if (this.popoverTrigger() === 'hover') {\n const el = overlayRef.overlayElement;\n const enter = (): void => this.ngZone.run(() => this.cancelClose());\n const leave = (): void => this.ngZone.run(() => this.scheduleClose());\n el.addEventListener('mouseenter', enter);\n el.addEventListener('mouseleave', leave);\n this.overlayListeners = { enter, leave };\n }\n\n this.openState.set(true);\n }\n\n /** Closes the popover. Safe to call when it is already closed. */\n close(): void {\n if (!this.overlayRef) {\n return;\n }\n\n if (this.overlayListeners) {\n const el = this.overlayRef.overlayElement;\n el.removeEventListener('mouseenter', this.overlayListeners.enter);\n el.removeEventListener('mouseleave', this.overlayListeners.leave);\n this.overlayListeners = null;\n }\n\n this.overlayRef.detach();\n this.openState.set(false);\n }\n\n /** Opens the popover when closed, closes it when open. */\n toggle(): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n private config(): Required<PopoverConfig> {\n return {\n placement: this.popoverPlacement(),\n align: this.popoverAlign(),\n offset: this.popoverOffset(),\n isCard: this.popoverCard(),\n cardSize: this.popoverCardSize(),\n ariaLabel: this.popoverAriaLabel(),\n };\n }\n\n private createOverlay(): void {\n this.overlayRef = this.popoverOverlay.create(this.elementRef, this.config());\n\n if (this.popoverTrigger() === 'click') {\n this.dismissSubscriptions = this.popoverOverlay.dismissOnOutsideOrEscape(\n this.overlayRef,\n this.elementRef.nativeElement,\n () => this.close()\n );\n }\n }\n\n private scheduleOpen(): void {\n this.openTimeout = setTimeout(() => this.open(), 100);\n }\n\n private cancelOpen(): void {\n if (this.openTimeout) {\n clearTimeout(this.openTimeout);\n this.openTimeout = null;\n }\n }\n\n private scheduleClose(): void {\n this.closeTimeout = setTimeout(() => this.close(), 150);\n }\n\n private cancelClose(): void {\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = null;\n }\n }\n\n ngOnInit(): void {\n if (this.popoverOpen()) {\n this.open();\n }\n }\n\n ngOnDestroy(): void {\n this.cancelOpen();\n this.cancelClose();\n this.close();\n this.dismissSubscriptions?.unsubscribe();\n this.overlayRef?.dispose();\n }\n}\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { DestroyRef, inject, Injectable, Injector, signal, TemplateRef } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nimport { PopoverOverlayService } from './popover-overlay.service';\nimport { POPOVER_DEFAULTS } from './popover.constants';\nimport { PopoverConfig, PopoverOpenConfig } from './popover.model';\n\nexport class PopoverRef {\n private readonly openState = signal(true);\n private readonly closedSubject$ = new Subject<void>();\n\n readonly isOpen = this.openState.asReadonly();\n /** Emits once, however the popover closed. */\n readonly closed$: Observable<void> = this.closedSubject$.asObservable();\n\n private stopClosingOnDestroy?: () => void;\n\n constructor(\n readonly anchor: HTMLElement,\n private readonly overlayRef: OverlayRef,\n destroyRef?: DestroyRef\n ) {\n this.stopClosingOnDestroy = destroyRef?.onDestroy(() => {\n this.stopClosingOnDestroy = undefined;\n this.close();\n });\n }\n\n close(): void {\n if (!this.openState()) {\n return;\n }\n this.openState.set(false);\n this.stopClosingOnDestroy?.();\n this.overlayRef.dispose();\n this.closedSubject$.next();\n this.closedSubject$.complete();\n }\n}\n\n/** Opens a popover against an anchor you do not own, with the same semantics as `popoverTrigger=\"click\"`. */\n@Injectable({ providedIn: 'root' })\nexport class PopoverService {\n private readonly popoverOverlay = inject(PopoverOverlayService);\n private readonly injector = inject(Injector);\n\n private active: PopoverRef | null = null;\n\n /** Returns the open popover when `anchor` already has one; any other popover opened here closes first. */\n open(anchor: HTMLElement, template: TemplateRef<unknown>, config: PopoverOpenConfig = {}): PopoverRef {\n const current = this.openRefFor(anchor);\n if (current) {\n return current;\n }\n this.active?.close();\n\n const { destroyRef, ...popoverConfig } = config;\n const resolved: Required<PopoverConfig> = { ...POPOVER_DEFAULTS, ariaLabel: '', ...popoverConfig };\n const overlayRef = this.popoverOverlay.create(anchor, resolved);\n const ref = new PopoverRef(anchor, overlayRef, destroyRef);\n const close = (): void => ref.close();\n\n this.popoverOverlay.attach(overlayRef, this.injector, template, close, {\n ...resolved,\n trapFocus: true,\n restoreFocusTo: anchor,\n });\n this.popoverOverlay.dismissOnOutsideOrEscape(overlayRef, anchor, close);\n\n this.active = ref;\n return ref;\n }\n\n /** Closes the popover when `anchor` has one open (returning `null`), opens it otherwise. */\n toggle(anchor: HTMLElement, template: TemplateRef<unknown>, config: PopoverOpenConfig = {}): PopoverRef | null {\n const current = this.openRefFor(anchor);\n if (current) {\n current.close();\n return null;\n }\n return this.open(anchor, template, config);\n }\n\n private openRefFor(anchor: HTMLElement): PopoverRef | null {\n const active = this.active;\n return active?.anchor === anchor && active.isOpen() ? active : null;\n }\n}\n"],"mappings":"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"}
@@ -752,12 +752,15 @@ var PromptComponent = class PromptComponent {
752
752
  "ariaExpanded",
753
753
  "ariaControls",
754
754
  "ariaPressed",
755
+ "ariaHasPopup",
755
756
  "ariaRequired",
756
757
  "ariaLabelledby",
757
758
  "ariaDescribedby",
758
759
  "preventDefault",
759
760
  "hasBackground",
760
761
  "circular",
762
+ "isSingleLineLabel",
763
+ "iconButtonShape",
761
764
  "tooltipPosition",
762
765
  "role",
763
766
  "iconFilled",
@@ -879,6 +882,7 @@ var PromptComponent = class PromptComponent {
879
882
  "uiPopover",
880
883
  "popoverOffset",
881
884
  "popoverAlign",
885
+ "popoverPlacement",
882
886
  "popoverOpen",
883
887
  "popoverCard",
884
888
  "popoverCardSize",