@fundamental-ngx/core 0.63.1-rc.8 → 0.63.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.
Files changed (92) hide show
  1. package/fesm2022/fundamental-ngx-core-action-bar.mjs +2 -2
  2. package/fesm2022/fundamental-ngx-core-action-sheet.mjs +2 -2
  3. package/fesm2022/fundamental-ngx-core-avatar-group.mjs +2 -2
  4. package/fesm2022/fundamental-ngx-core-avatar.mjs +2 -2
  5. package/fesm2022/fundamental-ngx-core-bar.mjs +2 -2
  6. package/fesm2022/fundamental-ngx-core-breadcrumb.mjs +2 -2
  7. package/fesm2022/fundamental-ngx-core-busy-indicator.mjs +2 -2
  8. package/fesm2022/fundamental-ngx-core-button.mjs +2 -2
  9. package/fesm2022/fundamental-ngx-core-calendar.mjs +2 -2
  10. package/fesm2022/fundamental-ngx-core-card.mjs +2 -2
  11. package/fesm2022/fundamental-ngx-core-carousel.mjs +2 -2
  12. package/fesm2022/fundamental-ngx-core-checkbox.mjs +2 -2
  13. package/fesm2022/fundamental-ngx-core-dialog.mjs +2 -2
  14. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs +2 -2
  15. package/fesm2022/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
  16. package/fesm2022/fundamental-ngx-core-dynamic-side-content.mjs +2 -2
  17. package/fesm2022/fundamental-ngx-core-facets.mjs +2 -2
  18. package/fesm2022/fundamental-ngx-core-feed-input.mjs +2 -2
  19. package/fesm2022/fundamental-ngx-core-feed-list-item.mjs +2 -2
  20. package/fesm2022/fundamental-ngx-core-file-uploader.mjs +2 -2
  21. package/fesm2022/fundamental-ngx-core-fixed-card-layout.mjs +2 -2
  22. package/fesm2022/fundamental-ngx-core-flexible-column-layout.mjs +2 -2
  23. package/fesm2022/fundamental-ngx-core-form.mjs +14 -14
  24. package/fesm2022/fundamental-ngx-core-generic-tag.mjs +2 -2
  25. package/fesm2022/fundamental-ngx-core-grid-list.mjs +2 -2
  26. package/fesm2022/fundamental-ngx-core-icon.mjs +2 -2
  27. package/fesm2022/fundamental-ngx-core-icon.mjs.map +1 -1
  28. package/fesm2022/fundamental-ngx-core-info-label.mjs +2 -2
  29. package/fesm2022/fundamental-ngx-core-input-group.mjs +2 -2
  30. package/fesm2022/fundamental-ngx-core-layout-grid.mjs +2 -2
  31. package/fesm2022/fundamental-ngx-core-layout-panel.mjs +2 -2
  32. package/fesm2022/fundamental-ngx-core-link.mjs +2 -2
  33. package/fesm2022/fundamental-ngx-core-list.mjs +34 -12
  34. package/fesm2022/fundamental-ngx-core-list.mjs.map +1 -1
  35. package/fesm2022/fundamental-ngx-core-menu.mjs +70 -15
  36. package/fesm2022/fundamental-ngx-core-menu.mjs.map +1 -1
  37. package/fesm2022/fundamental-ngx-core-message-box.mjs +2 -2
  38. package/fesm2022/fundamental-ngx-core-message-page.mjs +2 -2
  39. package/fesm2022/fundamental-ngx-core-message-strip.mjs +2 -2
  40. package/fesm2022/fundamental-ngx-core-message-toast.mjs +2 -2
  41. package/fesm2022/fundamental-ngx-core-micro-process-flow.mjs +2 -2
  42. package/fesm2022/fundamental-ngx-core-multi-combobox.mjs +2 -2
  43. package/fesm2022/fundamental-ngx-core-notification.mjs +2 -2
  44. package/fesm2022/fundamental-ngx-core-object-attribute.mjs +2 -2
  45. package/fesm2022/fundamental-ngx-core-object-identifier.mjs +2 -2
  46. package/fesm2022/fundamental-ngx-core-object-marker.mjs +2 -2
  47. package/fesm2022/fundamental-ngx-core-object-status.mjs +2 -2
  48. package/fesm2022/fundamental-ngx-core-pagination.mjs +2 -2
  49. package/fesm2022/fundamental-ngx-core-panel.mjs +2 -2
  50. package/fesm2022/fundamental-ngx-core-panel.mjs.map +1 -1
  51. package/fesm2022/fundamental-ngx-core-popover.mjs +2 -2
  52. package/fesm2022/fundamental-ngx-core-product-switch.mjs +2 -2
  53. package/fesm2022/fundamental-ngx-core-product-switch.mjs.map +1 -1
  54. package/fesm2022/fundamental-ngx-core-progress-indicator.mjs +2 -2
  55. package/fesm2022/fundamental-ngx-core-quick-view.mjs +2 -2
  56. package/fesm2022/fundamental-ngx-core-radio.mjs +2 -2
  57. package/fesm2022/fundamental-ngx-core-rating-indicator.mjs +2 -2
  58. package/fesm2022/fundamental-ngx-core-resizable-card-layout.mjs +4 -4
  59. package/fesm2022/fundamental-ngx-core-segmented-button.mjs +2 -2
  60. package/fesm2022/fundamental-ngx-core-select.mjs +2 -2
  61. package/fesm2022/fundamental-ngx-core-settings.mjs +4 -4
  62. package/fesm2022/fundamental-ngx-core-shellbar.mjs +4 -4
  63. package/fesm2022/fundamental-ngx-core-shellbar.mjs.map +1 -1
  64. package/fesm2022/fundamental-ngx-core-side-navigation.mjs +2 -2
  65. package/fesm2022/fundamental-ngx-core-skeleton.mjs +2 -2
  66. package/fesm2022/fundamental-ngx-core-slider.mjs +2 -2
  67. package/fesm2022/fundamental-ngx-core-split-button.mjs +2 -2
  68. package/fesm2022/fundamental-ngx-core-status-indicator.mjs +2 -2
  69. package/fesm2022/fundamental-ngx-core-step-input.mjs +2 -2
  70. package/fesm2022/fundamental-ngx-core-switch.mjs +2 -2
  71. package/fesm2022/fundamental-ngx-core-table.mjs +4 -4
  72. package/fesm2022/fundamental-ngx-core-tabs.mjs +4 -4
  73. package/fesm2022/fundamental-ngx-core-text.mjs +2 -2
  74. package/fesm2022/fundamental-ngx-core-tile.mjs +2 -2
  75. package/fesm2022/fundamental-ngx-core-time.mjs +2 -2
  76. package/fesm2022/fundamental-ngx-core-title.mjs +2 -2
  77. package/fesm2022/fundamental-ngx-core-token.mjs +4 -4
  78. package/fesm2022/fundamental-ngx-core-toolbar.mjs +2 -2
  79. package/fesm2022/fundamental-ngx-core-tree.mjs +2 -2
  80. package/fesm2022/fundamental-ngx-core-upload-collection.mjs +2 -2
  81. package/fesm2022/fundamental-ngx-core-user-menu.mjs +2 -2
  82. package/fesm2022/fundamental-ngx-core-vertical-navigation.mjs +4 -4
  83. package/fesm2022/fundamental-ngx-core-wizard.mjs +2 -2
  84. package/package.json +4 -4
  85. package/schematics/add-styles/index.js +2 -2
  86. package/schematics/add-styles/index.js.map +1 -1
  87. package/schematics/migrations.json +10 -0
  88. package/schematics/update-sibling-packages/index.d.ts +2 -0
  89. package/schematics/update-sibling-packages/index.js +52 -0
  90. package/schematics/update-sibling-packages/index.js.map +1 -0
  91. package/types/fundamental-ngx-core-list.d.ts +9 -0
  92. package/types/fundamental-ngx-core-menu.d.ts +10 -0
@@ -266,6 +266,11 @@ class MenuInteractiveComponent {
266
266
  }
267
267
  }
268
268
  /** @hidden */
269
+ get role() {
270
+ // Parent items switch to role="none" when expanded so VoiceOver doesn't count them.
271
+ return this.ariaHaspopup && this.ariaExpanded ? 'none' : 'menuitem';
272
+ }
273
+ /** @hidden */
269
274
  get startAddon() {
270
275
  if (!this._startAddonInstance) {
271
276
  this.addonPortalOutlet.detach();
@@ -301,7 +306,7 @@ class MenuInteractiveComponent {
301
306
  this._cdr.markForCheck();
302
307
  }
303
308
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuInteractiveComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
304
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: MenuInteractiveComponent, isStandalone: true, selector: "[fd-menu-interactive]", host: { attributes: { "role": "menuitem" }, listeners: { "keydown.enter": "_handleKeydown($event)", "keydown.space": "_handleKeydown($event)" }, properties: { "attr.tabindex": "this.tabindex", "class.is-disabled": "this.disabled", "attr.aria-controls": "this.ariaControls", "class.is-selected": "this.selected", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-haspopup": "this.ariaHaspopup", "class.has-child": "this.ariaHaspopup", "class.fd-menu__link": "this.fdMenuLinkClass" } }, queries: [{ propertyName: "_addon", first: true, predicate: MenuAddonDirective, descendants: true }, { propertyName: "_input", first: true, predicate: MenuItemInputDirective, descendants: true }], viewQueries: [{ propertyName: "addonPortalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true }], ngImport: i0, template: `
309
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.0", type: MenuInteractiveComponent, isStandalone: true, selector: "[fd-menu-interactive]", host: { listeners: { "keydown.enter": "_handleKeydown($event)", "keydown.space": "_handleKeydown($event)" }, properties: { "attr.role": "this.role", "attr.tabindex": "this.tabindex", "class.is-disabled": "this.disabled", "attr.aria-controls": "this.ariaControls", "class.is-selected": "this.selected", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-haspopup": "this.ariaHaspopup", "class.has-child": "this.ariaHaspopup", "class.fd-menu__link": "this.fdMenuLinkClass" } }, queries: [{ propertyName: "_addon", first: true, predicate: MenuAddonDirective, descendants: true }, { propertyName: "_input", first: true, predicate: MenuItemInputDirective, descendants: true }], viewQueries: [{ propertyName: "addonPortalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true }], ngImport: i0, template: `
305
310
  <ng-template cdkPortalOutlet></ng-template>
306
311
  <ng-content></ng-content>
307
312
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -315,9 +320,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
315
320
  <ng-template cdkPortalOutlet></ng-template>
316
321
  <ng-content></ng-content>
317
322
  `,
318
- host: {
319
- role: 'menuitem'
320
- },
321
323
  changeDetection: ChangeDetectionStrategy.OnPush,
322
324
  imports: [PortalModule]
323
325
  }]
@@ -327,6 +329,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
327
329
  }], _addon: [{
328
330
  type: ContentChild,
329
331
  args: [MenuAddonDirective]
332
+ }], role: [{
333
+ type: HostBinding,
334
+ args: ['attr.role']
330
335
  }], tabindex: [{
331
336
  type: HostBinding,
332
337
  args: ['attr.tabindex']
@@ -765,7 +770,7 @@ class MenuItemComponent {
765
770
  }));
766
771
  }
767
772
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
768
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: MenuItemComponent, isStandalone: true, selector: "li[fd-menu-item]", inputs: { disabled: "disabled", itemId: "itemId", submenu: "submenu", parentSubmenu: "parentSubmenu", hasSeparator: ["hasSeparator", "hasSeparator", booleanAttribute] }, outputs: { onSelect: "onSelect" }, host: { properties: { "attr.role": "\"menuitem\"", "class.fd-menu__item": "true", "class.fd-menu--full-width": "menuService?.menuComponent?.mobile() ?? false", "class.has-separator": "this.hasSeparator" } }, providers: [
773
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: MenuItemComponent, isStandalone: true, selector: "li[fd-menu-item]", inputs: { disabled: "disabled", itemId: "itemId", submenu: "submenu", parentSubmenu: "parentSubmenu", hasSeparator: ["hasSeparator", "hasSeparator", booleanAttribute] }, outputs: { onSelect: "onSelect" }, host: { properties: { "class.fd-menu__item": "true", "class.fd-menu--full-width": "menuService?.menuComponent?.mobile() ?? false", "class.has-separator": "this.hasSeparator" } }, providers: [
769
774
  {
770
775
  provide: FD_MENU_ITEM_COMPONENT,
771
776
  useExisting: forwardRef(() => MenuItemComponent)
@@ -775,7 +780,6 @@ class MenuItemComponent {
775
780
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuItemComponent, decorators: [{
776
781
  type: Component,
777
782
  args: [{ selector: 'li[fd-menu-item]', exportAs: 'fd-menu-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
778
- '[attr.role]': '"menuitem"',
779
783
  '[class.fd-menu__item]': 'true',
780
784
  '[class.fd-menu--full-width]': 'menuService?.menuComponent?.mobile() ?? false'
781
785
  }, imports: [NgTemplateOutlet], providers: [
@@ -1493,6 +1497,7 @@ class MenuComponent {
1493
1497
  this._viewContainerRef = inject(ViewContainerRef);
1494
1498
  this._dynamicComponentService = inject(DynamicComponentService, { optional: true });
1495
1499
  this._destroyRef = inject(DestroyRef);
1500
+ this._submenuSubscriptions = new Map();
1496
1501
  // Watch mobile mode changes
1497
1502
  effect(() => {
1498
1503
  this._menuService.setMenuMode(this.mobile());
@@ -1545,22 +1550,22 @@ class MenuComponent {
1545
1550
  // Use afterNextRender to ensure this runs after ngAfterContentInit sets the menu component
1546
1551
  afterNextRender(() => {
1547
1552
  runInInjectionContext(this._injector, () => {
1548
- // Track previous subscriptions to clean up when effect re-runs
1549
- let submenuSubscriptions = [];
1550
1553
  effect((onCleanup) => {
1551
1554
  // Clean up previous subscriptions before creating new ones
1552
- submenuSubscriptions.forEach((unsubscribe) => unsubscribe());
1553
- submenuSubscriptions = [];
1555
+ this._clearSubmenuSubscriptions();
1554
1556
  const menuItems = this._menuItems();
1555
1557
  this._menuService.rebuildMenu();
1558
+ // Set aria-posinset and aria-setsize for all menu items recursively
1559
+ // IMPORTANT: Defer this until after Angular processes @Input() bindings
1560
+ // Otherwise menuItem.submenu will be undefined
1561
+ afterNextRender(() => {
1562
+ this._setAriaPositionAttributesRecursive(menuItems);
1563
+ }, { injector: this._injector });
1556
1564
  // Whether menu have submenu or not.
1557
1565
  let hasSubmenus = false;
1558
1566
  menuItems.forEach((menuItem) => {
1559
1567
  if (menuItem.submenu) {
1560
1568
  hasSubmenus = true;
1561
- // Subscribe to submenu changes and track subscription for cleanup
1562
- const subscription = menuItem.submenu._menuItemsChange$.subscribe(() => this._menuService.rebuildMenu());
1563
- submenuSubscriptions.push(() => subscription.unsubscribe());
1564
1569
  }
1565
1570
  });
1566
1571
  // Always disable scrollbar when menu has submenus to prevent clipping
@@ -1570,8 +1575,7 @@ class MenuComponent {
1570
1575
  this._popoverService.disableScrollbar.set(shouldDisableScrollbar);
1571
1576
  // Cleanup callback when effect is destroyed or re-runs
1572
1577
  onCleanup(() => {
1573
- submenuSubscriptions.forEach((unsubscribe) => unsubscribe());
1574
- submenuSubscriptions = [];
1578
+ this._clearSubmenuSubscriptions();
1575
1579
  });
1576
1580
  });
1577
1581
  });
@@ -1813,6 +1817,57 @@ class MenuComponent {
1813
1817
  this.trigger.nativeElement.focus();
1814
1818
  }
1815
1819
  }
1820
+ /** @hidden */
1821
+ _clearSubmenuSubscriptions() {
1822
+ this._submenuSubscriptions.forEach((unsubscribe) => unsubscribe());
1823
+ this._submenuSubscriptions.clear();
1824
+ }
1825
+ /**
1826
+ * @hidden
1827
+ * Sets aria-posinset and aria-setsize on all menu items recursively.
1828
+ */
1829
+ _setAriaPositionAttributesRecursive(menuItems) {
1830
+ // Filter out submenu items - contentChildren returns all descendants
1831
+ const submenuItems = new Set();
1832
+ menuItems.forEach((item) => {
1833
+ if (item.submenu?.menuItems) {
1834
+ item.submenu.menuItems.forEach((child) => submenuItems.add(child));
1835
+ }
1836
+ });
1837
+ const directChildren = menuItems.filter((item) => !submenuItems.has(item));
1838
+ const directInteractiveItems = directChildren
1839
+ .map((menuItem) => ({
1840
+ menuItem,
1841
+ interactiveElement: menuItem.elementRef.nativeElement.querySelector('[fd-menu-interactive]')
1842
+ }))
1843
+ .filter(({ interactiveElement }) => !!interactiveElement && (interactiveElement.getAttribute('role') || 'menuitem') === 'menuitem');
1844
+ directChildren.forEach((menuItem) => {
1845
+ const interactiveElement = menuItem.elementRef.nativeElement.querySelector('[fd-menu-interactive]');
1846
+ if (interactiveElement) {
1847
+ const position = directInteractiveItems.findIndex((item) => item.menuItem === menuItem);
1848
+ if (position > -1) {
1849
+ this._renderer.setAttribute(interactiveElement, 'aria-posinset', String(position + 1));
1850
+ this._renderer.setAttribute(interactiveElement, 'aria-setsize', String(directInteractiveItems.length));
1851
+ }
1852
+ else {
1853
+ // Keep aria metadata aligned when an item switches to role="none".
1854
+ this._renderer.removeAttribute(interactiveElement, 'aria-posinset');
1855
+ this._renderer.removeAttribute(interactiveElement, 'aria-setsize');
1856
+ }
1857
+ }
1858
+ if (menuItem.submenu) {
1859
+ const nestedMenuItems = menuItem.submenu.menuItems || [];
1860
+ this._setAriaPositionAttributesRecursive(nestedMenuItems);
1861
+ if (!this._submenuSubscriptions.has(menuItem.submenu)) {
1862
+ const subscription = menuItem.submenu._menuItemsChange$.subscribe(() => {
1863
+ this._menuService.rebuildMenu();
1864
+ this._setAriaPositionAttributesRecursive(this._menuItems());
1865
+ });
1866
+ this._submenuSubscriptions.set(menuItem.submenu, () => subscription.unsubscribe());
1867
+ }
1868
+ }
1869
+ });
1870
+ }
1816
1871
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1817
1872
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.0", type: MenuComponent, isStandalone: true, selector: "fd-menu", inputs: { openOnHoverTime: { classPropertyName: "openOnHoverTime", publicName: "openOnHoverTime", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, mobile: { classPropertyName: "mobile", publicName: "mobile", isSignal: true, isRequired: false, transformFunction: null }, mobileConfig: { classPropertyName: "mobileConfig", publicName: "mobileConfig", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscapeKey: { classPropertyName: "closeOnEscapeKey", publicName: "closeOnEscapeKey", isSignal: true, isRequired: false, transformFunction: null }, focusAutoCapture: { classPropertyName: "focusAutoCapture", publicName: "focusAutoCapture", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, disableScrollbar: { classPropertyName: "disableScrollbar", publicName: "disableScrollbar", isSignal: true, isRequired: false, transformFunction: null }, triggers: { classPropertyName: "triggers", publicName: "triggers", isSignal: true, isRequired: false, transformFunction: null }, fillControlMode: { classPropertyName: "fillControlMode", publicName: "fillControlMode", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "closeOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null }, noArrow: { classPropertyName: "noArrow", publicName: "noArrow", isSignal: true, isRequired: false, transformFunction: null }, focusTrapped: { classPropertyName: "focusTrapped", publicName: "focusTrapped", isSignal: true, isRequired: false, transformFunction: null }, additionalBodyClass: { classPropertyName: "additionalBodyClass", publicName: "additionalBodyClass", isSignal: true, isRequired: false, transformFunction: null }, closeOnNavigation: { classPropertyName: "closeOnNavigation", publicName: "closeOnNavigation", isSignal: true, isRequired: false, transformFunction: null }, restoreFocusOnClose: { classPropertyName: "restoreFocusOnClose", publicName: "restoreFocusOnClose", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, fixedPosition: { classPropertyName: "fixedPosition", publicName: "fixedPosition", isSignal: true, isRequired: false, transformFunction: null }, scrollStrategy: { classPropertyName: "scrollStrategy", publicName: "scrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isOpen: "isOpenChange", isOpenChange: "isOpenChange", activePath: "activePath", beforeOpen: "beforeOpen" }, host: { properties: { "class.fd-popover-custom--disabled": "disabled()" } }, providers: [
1818
1873
  MenuService,