@progress/kendo-angular-menu 21.4.0-develop.1 → 21.4.0-develop.3

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.
@@ -5,7 +5,7 @@
5
5
  import { Component, Input, ContentChild, ViewChild, EventEmitter, Output, NgZone, Renderer2, TemplateRef, ViewContainerRef, forwardRef } from '@angular/core';
6
6
  import { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
7
7
  import { PopupService, POPUP_CONTAINER } from '@progress/kendo-angular-popup';
8
- import { hasObservers, Keys, isDocumentAvailable } from '@progress/kendo-angular-common';
8
+ import { hasObservers, Keys, isDocumentAvailable, parseCSSClassNames } from '@progress/kendo-angular-common';
9
9
  import { MenuBase } from '../menu-base';
10
10
  import { ContextMenuPopupEvent } from './context-menu-popup-event';
11
11
  import { ContextMenuService } from './context-menu.service';
@@ -18,6 +18,7 @@ import { ContextMenuTargetContainerDirective } from './context-menu-target-conta
18
18
  import { TARGET_CLASS } from './context-menu-target.directive';
19
19
  import { bodyFactory } from '../utils';
20
20
  import { MenuComponent } from '../menu.component';
21
+ import { DEFAULT_MARGIN } from '../rendering/popup-settings';
21
22
  import * as i0 from "@angular/core";
22
23
  import * as i1 from "@progress/kendo-angular-popup";
23
24
  import * as i2 from "./context-menu.service";
@@ -332,6 +333,7 @@ export class ContextMenuComponent extends MenuBase {
332
333
  });
333
334
  }
334
335
  createPopup(options) {
336
+ const customClasses = this.popupSettings?.popupClass ? parseCSSClassNames(this.popupSettings.popupClass) : [];
335
337
  this.popupRef = this.popupService.open(Object.assign({
336
338
  animate: defined(this.popupAnimate) ? this.popupAnimate : true,
337
339
  appendTo: this.appendTo,
@@ -339,7 +341,8 @@ export class ContextMenuComponent extends MenuBase {
339
341
  popupAlign: this.popupAlign || DEFAULT_POPUP_ALIGN,
340
342
  anchorAlign: this.anchorAlign || DEFAULT_ANCHOR_ALIGN,
341
343
  content: this.contentTemplate ? this.contentTemplate.templateRef : this.defaultContentTemplate,
342
- popupClass: 'k-menu-popup',
344
+ popupClass: ['k-menu-popup', ...customClasses],
345
+ margin: this.popupSettings?.margin ?? DEFAULT_MARGIN,
343
346
  positionMode: 'absolute'
344
347
  }, options));
345
348
  const element = this.popupRef.popupElement;
@@ -431,6 +434,7 @@ export class ContextMenuComponent extends MenuBase {
431
434
  [openOnClick]="openOnClick"
432
435
  [hoverDelay]="hoverDelay"
433
436
  [animate]="animate"
437
+ [popupSettings]="popupSettings"
434
438
  [menuItemTemplate]="itemTemplate.first?.templateRef"
435
439
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
436
440
  ></kendo-menu>
@@ -473,6 +477,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
473
477
  [openOnClick]="openOnClick"
474
478
  [hoverDelay]="hoverDelay"
475
479
  [animate]="animate"
480
+ [popupSettings]="popupSettings"
476
481
  [menuItemTemplate]="itemTemplate.first?.templateRef"
477
482
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
478
483
  ></kendo-menu>
@@ -45,6 +45,11 @@ export class MenuBase {
45
45
  *
46
46
  */
47
47
  size = 'medium';
48
+ /**
49
+ * Configures the popup settings for the Menu items.
50
+ * Allows customization of the popup class and margin.
51
+ */
52
+ popupSettings;
48
53
  /**
49
54
  * @hidden
50
55
  */
@@ -64,7 +69,7 @@ export class MenuBase {
64
69
  return this.items || (this.children ? this.children.toArray() : []);
65
70
  }
66
71
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
67
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenuBase, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
72
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenuBase, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size", popupSettings: "popupSettings" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
68
73
  }
69
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuBase, decorators: [{
70
75
  type: Component,
@@ -84,6 +89,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
84
89
  type: Input
85
90
  }], size: [{
86
91
  type: Input
92
+ }], popupSettings: [{
93
+ type: Input
87
94
  }], itemTemplate: [{
88
95
  type: ContentChildren,
89
96
  args: [ItemTemplateDirective]
@@ -242,9 +242,10 @@ export class MenuComponent extends MenuBase {
242
242
  [size]="size" [vertical]="vertical" [rtl]="rtl" [animate]="animate" [openOnClick]="openOnClick"
243
243
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
244
244
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
245
+ [popupSettings]="popupSettings"
245
246
  [ngClass]="menuClasses">
246
247
  </ul>
247
- `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
248
+ `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
248
249
  }
249
250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuComponent, decorators: [{
250
251
  type: Component,
@@ -274,6 +275,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
274
275
  [size]="size" [vertical]="vertical" [rtl]="rtl" [animate]="animate" [openOnClick]="openOnClick"
275
276
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
276
277
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
278
+ [popupSettings]="popupSettings"
277
279
  [ngClass]="menuClasses">
278
280
  </ul>
279
281
  `,
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1765536325,
14
- version: '21.4.0-develop.1',
13
+ publishDate: 1765793550,
14
+ version: '21.4.0-develop.3',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
16
16
  };
@@ -5,7 +5,7 @@
5
5
  import { Component, ElementRef, Input, NgZone, Optional, Renderer2, TemplateRef, ViewContainerRef, forwardRef } from '@angular/core';
6
6
  import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
7
7
  import { ChangeDetectorRef, HostBinding, ViewChild } from '@angular/core';
8
- import { isDocumentAvailable } from '@progress/kendo-angular-common';
8
+ import { isDocumentAvailable, isPresent, parseCSSClassNames } from '@progress/kendo-angular-common';
9
9
  import { POPUP_CONTAINER, PopupService } from '@progress/kendo-angular-popup';
10
10
  import { IconWrapperComponent } from '@progress/kendo-angular-icons';
11
11
  import { ContextMenuService } from '../context-menu/context-menu.service';
@@ -16,7 +16,7 @@ import { HoverService } from '../services/hover.service';
16
16
  import { ItemsService } from '../services/items.service';
17
17
  import { NavigationService } from '../services/navigation.service';
18
18
  import { bodyFactory, getFontIcon, getSizeClass, getSVGIcon } from '../utils';
19
- import { POPUP_SETTINGS, POPUP_SETTINGS_RTL } from './popup-settings';
19
+ import { DEFAULT_MARGIN, POPUP_SETTINGS, POPUP_SETTINGS_RTL } from './popup-settings';
20
20
  import * as i0 from "@angular/core";
21
21
  import * as i1 from "../services/items.service";
22
22
  import * as i2 from "../services/hover.service";
@@ -47,6 +47,7 @@ export class ListComponent {
47
47
  openOnClick;
48
48
  itemTemplate;
49
49
  itemLinkTemplate;
50
+ popupSettings;
50
51
  domSubscriptions;
51
52
  constructor(itemsService, hover, actions, navigation, renderer, ngZone, element) {
52
53
  this.itemsService = itemsService;
@@ -196,7 +197,7 @@ export class ListComponent {
196
197
  this.actions.execute();
197
198
  }
198
199
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, deps: [{ token: i1.ItemsService }, { token: i2.HoverService }, { token: i3.ActionsService }, { token: i4.NavigationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
199
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate" }, ngImport: i0, template: "\n @for (item of items; track item; let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
200
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, ngImport: i0, template: "\n @for (item of items; track item; let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [popupSettings]=\"popupSettings\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
200
201
  }
201
202
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, decorators: [{
202
203
  type: Component,
@@ -216,6 +217,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
216
217
  [rtl]="rtl"
217
218
  [itemTemplate]="itemTemplate"
218
219
  [itemLinkTemplate]="itemLinkTemplate"
220
+ [popupSettings]="popupSettings"
219
221
  [openOnClick]="openOnClick"
220
222
  [index]="hierarchyIndex(idx)"
221
223
  [siblingIndex]="idx"
@@ -264,6 +266,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
264
266
  type: Input
265
267
  }], itemLinkTemplate: [{
266
268
  type: Input
269
+ }], popupSettings: [{
270
+ type: Input
267
271
  }] } });
268
272
  /**
269
273
  * @hidden
@@ -301,6 +305,7 @@ export class ItemComponent {
301
305
  openOnClick = false;
302
306
  itemTemplate;
303
307
  itemLinkTemplate;
308
+ popupSettings;
304
309
  link;
305
310
  popupTemplate;
306
311
  get disabled() {
@@ -312,7 +317,7 @@ export class ItemComponent {
312
317
  get label() {
313
318
  return this.item.text ? this.item.text : null;
314
319
  }
315
- get popupSettings() {
320
+ get defaultPopupSettings() {
316
321
  const settings = this.rtl ? POPUP_SETTINGS_RTL : POPUP_SETTINGS;
317
322
  return this.horizontal ? settings.horizontal : settings.vertical;
318
323
  }
@@ -421,7 +426,7 @@ export class ItemComponent {
421
426
  }
422
427
  open() {
423
428
  if (!this.destroyed && this.hasContent && !this.opened) {
424
- const popupSettings = this.popupSettings;
429
+ const popupSettings = this.getMergedPopupSettings();
425
430
  const animate = this.animate ? Object.assign({}, this.animate, {
426
431
  direction: popupSettings.animate
427
432
  }) : false;
@@ -434,10 +439,8 @@ export class ItemComponent {
434
439
  anchor: this.element,
435
440
  positionMode: 'absolute',
436
441
  content: this.popupTemplate,
437
- popupClass: {
438
- 'k-rtl': this.rtl,
439
- 'k-menu-popup': true
440
- },
442
+ popupClass: popupSettings.popupClass,
443
+ margin: popupSettings.margin,
441
444
  animate: animate
442
445
  });
443
446
  this.setAttribute('aria-expanded', 'true');
@@ -474,8 +477,20 @@ export class ItemComponent {
474
477
  setAttribute(name, value) {
475
478
  this.renderer.setAttribute(this.element.nativeElement, name, value);
476
479
  }
480
+ getMergedPopupSettings() {
481
+ if (!isPresent(this.popupSettings)) {
482
+ return this.defaultPopupSettings;
483
+ }
484
+ const defaultSettings = this.defaultPopupSettings;
485
+ const customClasses = this.popupSettings.popupClass ? parseCSSClassNames(this.popupSettings.popupClass) : [];
486
+ return {
487
+ ...defaultSettings,
488
+ popupClass: customClasses.length ? [...defaultSettings.popupClass, ...customClasses] : defaultSettings.popupClass,
489
+ margin: this.popupSettings.margin ?? DEFAULT_MARGIN
490
+ };
491
+ }
477
492
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, deps: [{ token: i1.ItemsService }, { token: i4.NavigationService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i5.PopupService }, { token: i0.ElementRef }, { token: i6.ContextMenuService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
478
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
493
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
479
494
  provide: POPUP_CONTAINER,
480
495
  useFactory: bodyFactory
481
496
  }], viewQueries: [{ propertyName: "link", first: true, predicate: ["link"], descendants: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], ngImport: i0, template: `
@@ -520,6 +535,7 @@ export class ItemComponent {
520
535
  [index]="index"
521
536
  [itemTemplate]="itemTemplate"
522
537
  [itemLinkTemplate]="itemLinkTemplate"
538
+ [popupSettings]="popupSettings"
523
539
  [ngClass]="menuListClasses"
524
540
  role="menu">
525
541
  </ul>
@@ -540,7 +556,7 @@ export class ItemComponent {
540
556
  <kendo-icon-wrapper [name]="fontIcon(horizontal, rtl)" [svgIcon]="SVGIcon(horizontal, rtl)" class="k-menu-expand-arrow" aria-hidden="true"></kendo-icon-wrapper>
541
557
  }
542
558
  </ng-template>
543
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
559
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
544
560
  }
545
561
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, decorators: [{
546
562
  type: Component,
@@ -592,6 +608,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
592
608
  [index]="index"
593
609
  [itemTemplate]="itemTemplate"
594
610
  [itemLinkTemplate]="itemLinkTemplate"
611
+ [popupSettings]="popupSettings"
595
612
  [ngClass]="menuListClasses"
596
613
  role="menu">
597
614
  </ul>
@@ -642,6 +659,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
642
659
  type: Input
643
660
  }], itemLinkTemplate: [{
644
661
  type: Input
662
+ }], popupSettings: [{
663
+ type: Input
645
664
  }], link: [{
646
665
  type: ViewChild,
647
666
  args: ['link', { static: false }]
@@ -18,6 +18,10 @@ const HORIZONTAL_COLLISION = {
18
18
  vertical: 'fit',
19
19
  horizontal: 'flip'
20
20
  };
21
+ /**
22
+ * @hidden
23
+ */
24
+ export const DEFAULT_MARGIN = { horizontal: 0, vertical: 0 };
21
25
  /**
22
26
  * @hidden
23
27
  */
@@ -29,7 +33,8 @@ export const POPUP_SETTINGS_RTL = {
29
33
  },
30
34
  popup: POPUP_ALIGN_RTL,
31
35
  collision: VERTICAL_COLLISION,
32
- animate: 'down'
36
+ animate: 'down',
37
+ popupClass: ['k-rtl', 'k-menu-popup']
33
38
  },
34
39
  horizontal: {
35
40
  anchor: {
@@ -38,7 +43,8 @@ export const POPUP_SETTINGS_RTL = {
38
43
  },
39
44
  popup: POPUP_ALIGN_RTL,
40
45
  collision: HORIZONTAL_COLLISION,
41
- animate: 'left'
46
+ animate: 'left',
47
+ popupClass: ['k-rtl', 'k-menu-popup']
42
48
  }
43
49
  };
44
50
  /**
@@ -52,7 +58,8 @@ export const POPUP_SETTINGS = {
52
58
  },
53
59
  popup: POPUP_ALIGN,
54
60
  collision: VERTICAL_COLLISION,
55
- animate: 'down'
61
+ animate: 'down',
62
+ popupClass: ['k-menu-popup']
56
63
  },
57
64
  horizontal: {
58
65
  anchor: {
@@ -61,6 +68,7 @@ export const POPUP_SETTINGS = {
61
68
  },
62
69
  popup: POPUP_ALIGN,
63
70
  collision: HORIZONTAL_COLLISION,
64
- animate: 'right'
71
+ animate: 'right',
72
+ popupClass: ['k-menu-popup']
65
73
  }
66
74
  };
@@ -8,7 +8,7 @@ import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
8
8
  import * as i3 from '@progress/kendo-angular-l10n';
9
9
  import { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
10
10
  import { validatePackage } from '@progress/kendo-licensing';
11
- import { PreventableEvent as PreventableEvent$1, hasObservers, Keys, normalizeKeys, isDocumentAvailable, ResizeBatchService } from '@progress/kendo-angular-common';
11
+ import { PreventableEvent as PreventableEvent$1, hasObservers, Keys, normalizeKeys, isDocumentAvailable, isPresent, parseCSSClassNames, ResizeBatchService } from '@progress/kendo-angular-common';
12
12
  import { caretAltLeftIcon, caretAltRightIcon, caretAltDownIcon } from '@progress/kendo-svg-icons';
13
13
  import * as i5 from '@progress/kendo-angular-popup';
14
14
  import { PopupService, POPUP_CONTAINER } from '@progress/kendo-angular-popup';
@@ -22,8 +22,8 @@ const packageMetadata = {
22
22
  productName: 'Kendo UI for Angular',
23
23
  productCode: 'KENDOUIANGULAR',
24
24
  productCodes: ['KENDOUIANGULAR'],
25
- publishDate: 1765536325,
26
- version: '21.4.0-develop.1',
25
+ publishDate: 1765793550,
26
+ version: '21.4.0-develop.3',
27
27
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
28
28
  };
29
29
 
@@ -1171,6 +1171,11 @@ class MenuBase {
1171
1171
  *
1172
1172
  */
1173
1173
  size = 'medium';
1174
+ /**
1175
+ * Configures the popup settings for the Menu items.
1176
+ * Allows customization of the popup class and margin.
1177
+ */
1178
+ popupSettings;
1174
1179
  /**
1175
1180
  * @hidden
1176
1181
  */
@@ -1190,7 +1195,7 @@ class MenuBase {
1190
1195
  return this.items || (this.children ? this.children.toArray() : []);
1191
1196
  }
1192
1197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
1193
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenuBase, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
1198
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MenuBase, selector: "kendo-menu-base", inputs: { items: "items", vertical: "vertical", openOnClick: "openOnClick", hoverDelay: "hoverDelay", animate: "animate", size: "size", popupSettings: "popupSettings" }, queries: [{ propertyName: "itemTemplate", predicate: ItemTemplateDirective }, { propertyName: "itemLinkTemplate", predicate: ItemLinkTemplateDirective }, { propertyName: "children", predicate: MenuItemComponent }], ngImport: i0, template: ``, isInline: true });
1194
1199
  }
1195
1200
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuBase, decorators: [{
1196
1201
  type: Component,
@@ -1210,6 +1215,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1210
1215
  type: Input
1211
1216
  }], size: [{
1212
1217
  type: Input
1218
+ }], popupSettings: [{
1219
+ type: Input
1213
1220
  }], itemTemplate: [{
1214
1221
  type: ContentChildren,
1215
1222
  args: [ItemTemplateDirective]
@@ -1283,6 +1290,10 @@ const HORIZONTAL_COLLISION = {
1283
1290
  vertical: 'fit',
1284
1291
  horizontal: 'flip'
1285
1292
  };
1293
+ /**
1294
+ * @hidden
1295
+ */
1296
+ const DEFAULT_MARGIN = { horizontal: 0, vertical: 0 };
1286
1297
  /**
1287
1298
  * @hidden
1288
1299
  */
@@ -1294,7 +1305,8 @@ const POPUP_SETTINGS_RTL = {
1294
1305
  },
1295
1306
  popup: POPUP_ALIGN_RTL,
1296
1307
  collision: VERTICAL_COLLISION,
1297
- animate: 'down'
1308
+ animate: 'down',
1309
+ popupClass: ['k-rtl', 'k-menu-popup']
1298
1310
  },
1299
1311
  horizontal: {
1300
1312
  anchor: {
@@ -1303,7 +1315,8 @@ const POPUP_SETTINGS_RTL = {
1303
1315
  },
1304
1316
  popup: POPUP_ALIGN_RTL,
1305
1317
  collision: HORIZONTAL_COLLISION,
1306
- animate: 'left'
1318
+ animate: 'left',
1319
+ popupClass: ['k-rtl', 'k-menu-popup']
1307
1320
  }
1308
1321
  };
1309
1322
  /**
@@ -1317,7 +1330,8 @@ const POPUP_SETTINGS = {
1317
1330
  },
1318
1331
  popup: POPUP_ALIGN,
1319
1332
  collision: VERTICAL_COLLISION,
1320
- animate: 'down'
1333
+ animate: 'down',
1334
+ popupClass: ['k-menu-popup']
1321
1335
  },
1322
1336
  horizontal: {
1323
1337
  anchor: {
@@ -1326,7 +1340,8 @@ const POPUP_SETTINGS = {
1326
1340
  },
1327
1341
  popup: POPUP_ALIGN,
1328
1342
  collision: HORIZONTAL_COLLISION,
1329
- animate: 'right'
1343
+ animate: 'right',
1344
+ popupClass: ['k-menu-popup']
1330
1345
  }
1331
1346
  };
1332
1347
 
@@ -1353,6 +1368,7 @@ class ListComponent {
1353
1368
  openOnClick;
1354
1369
  itemTemplate;
1355
1370
  itemLinkTemplate;
1371
+ popupSettings;
1356
1372
  domSubscriptions;
1357
1373
  constructor(itemsService, hover, actions, navigation, renderer, ngZone, element) {
1358
1374
  this.itemsService = itemsService;
@@ -1502,7 +1518,7 @@ class ListComponent {
1502
1518
  this.actions.execute();
1503
1519
  }
1504
1520
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, deps: [{ token: ItemsService }, { token: HoverService }, { token: ActionsService }, { token: NavigationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1505
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate" }, ngImport: i0, template: "\n @for (item of items; track item; let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
1521
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "[kendoMenuList]", inputs: { appendTo: "appendTo", items: "items", level: "level", index: "index", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, ngImport: i0, template: "\n @for (item of items; track item; let idx = $index) {\n @if (!item.separator) {\n <li\n kendoMenuItem\n [appendTo]=\"appendTo\"\n [item]=\"item\"\n [level]=\"level\"\n [size]=\"size\"\n [vertical]=\"vertical\"\n [animate]=\"animate\"\n [rtl]=\"rtl\"\n [itemTemplate]=\"itemTemplate\"\n [itemLinkTemplate]=\"itemLinkTemplate\"\n [popupSettings]=\"popupSettings\"\n [openOnClick]=\"openOnClick\"\n [index]=\"hierarchyIndex(idx)\"\n [siblingIndex]=\"idx\"\n [attr.data-kendo-menu-index]=\"hierarchyIndex(idx)\"\n [ngClass]=\"item.cssClass\"\n [ngStyle]=\"item.cssStyle\"\n role=\"menuitem\"\n class=\"k-item k-menu-item\"\n [class.k-first]=\"idx === 0\"\n [class.k-last]=\"idx === items.length - 1\"\n [class.k-disabled]=\"item.disabled\"></li>\n }\n @if (item.separator) {\n <li\n class=\"k-separator k-item\"\n [ngClass]=\"item.cssClass\"\n aria-hidden=\"true\"\n [ngStyle]=\"item.cssStyle\">\n &nbsp;\n </li>\n }\n }\n ", isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => ItemComponent), selector: "[kendoMenuItem]", inputs: ["appendTo", "item", "level", "index", "siblingIndex", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: i0.forwardRef(() => NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }] });
1506
1522
  }
1507
1523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, decorators: [{
1508
1524
  type: Component,
@@ -1522,6 +1538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1522
1538
  [rtl]="rtl"
1523
1539
  [itemTemplate]="itemTemplate"
1524
1540
  [itemLinkTemplate]="itemLinkTemplate"
1541
+ [popupSettings]="popupSettings"
1525
1542
  [openOnClick]="openOnClick"
1526
1543
  [index]="hierarchyIndex(idx)"
1527
1544
  [siblingIndex]="idx"
@@ -1570,6 +1587,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1570
1587
  type: Input
1571
1588
  }], itemLinkTemplate: [{
1572
1589
  type: Input
1590
+ }], popupSettings: [{
1591
+ type: Input
1573
1592
  }] } });
1574
1593
  /**
1575
1594
  * @hidden
@@ -1607,6 +1626,7 @@ class ItemComponent {
1607
1626
  openOnClick = false;
1608
1627
  itemTemplate;
1609
1628
  itemLinkTemplate;
1629
+ popupSettings;
1610
1630
  link;
1611
1631
  popupTemplate;
1612
1632
  get disabled() {
@@ -1618,7 +1638,7 @@ class ItemComponent {
1618
1638
  get label() {
1619
1639
  return this.item.text ? this.item.text : null;
1620
1640
  }
1621
- get popupSettings() {
1641
+ get defaultPopupSettings() {
1622
1642
  const settings = this.rtl ? POPUP_SETTINGS_RTL : POPUP_SETTINGS;
1623
1643
  return this.horizontal ? settings.horizontal : settings.vertical;
1624
1644
  }
@@ -1727,7 +1747,7 @@ class ItemComponent {
1727
1747
  }
1728
1748
  open() {
1729
1749
  if (!this.destroyed && this.hasContent && !this.opened) {
1730
- const popupSettings = this.popupSettings;
1750
+ const popupSettings = this.getMergedPopupSettings();
1731
1751
  const animate = this.animate ? Object.assign({}, this.animate, {
1732
1752
  direction: popupSettings.animate
1733
1753
  }) : false;
@@ -1740,10 +1760,8 @@ class ItemComponent {
1740
1760
  anchor: this.element,
1741
1761
  positionMode: 'absolute',
1742
1762
  content: this.popupTemplate,
1743
- popupClass: {
1744
- 'k-rtl': this.rtl,
1745
- 'k-menu-popup': true
1746
- },
1763
+ popupClass: popupSettings.popupClass,
1764
+ margin: popupSettings.margin,
1747
1765
  animate: animate
1748
1766
  });
1749
1767
  this.setAttribute('aria-expanded', 'true');
@@ -1780,8 +1798,20 @@ class ItemComponent {
1780
1798
  setAttribute(name, value) {
1781
1799
  this.renderer.setAttribute(this.element.nativeElement, name, value);
1782
1800
  }
1801
+ getMergedPopupSettings() {
1802
+ if (!isPresent(this.popupSettings)) {
1803
+ return this.defaultPopupSettings;
1804
+ }
1805
+ const defaultSettings = this.defaultPopupSettings;
1806
+ const customClasses = this.popupSettings.popupClass ? parseCSSClassNames(this.popupSettings.popupClass) : [];
1807
+ return {
1808
+ ...defaultSettings,
1809
+ popupClass: customClasses.length ? [...defaultSettings.popupClass, ...customClasses] : defaultSettings.popupClass,
1810
+ margin: this.popupSettings.margin ?? DEFAULT_MARGIN
1811
+ };
1812
+ }
1783
1813
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, deps: [{ token: ItemsService }, { token: NavigationService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i5.PopupService }, { token: i0.ElementRef }, { token: ContextMenuService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1784
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
1814
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ItemComponent, isStandalone: true, selector: "[kendoMenuItem]", inputs: { appendTo: "appendTo", item: "item", level: "level", index: "index", siblingIndex: "siblingIndex", animate: "animate", size: "size", vertical: "vertical", rtl: "rtl", openOnClick: "openOnClick", itemTemplate: "itemTemplate", itemLinkTemplate: "itemLinkTemplate", popupSettings: "popupSettings" }, host: { properties: { "attr.aria-disabled": "this.disabled", "attr.aria-haspopup": "this.hasPopup", "attr.aria-label": "this.label" } }, providers: [PopupService, {
1785
1815
  provide: POPUP_CONTAINER,
1786
1816
  useFactory: bodyFactory
1787
1817
  }], viewQueries: [{ propertyName: "link", first: true, predicate: ["link"], descendants: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], ngImport: i0, template: `
@@ -1826,6 +1856,7 @@ class ItemComponent {
1826
1856
  [index]="index"
1827
1857
  [itemTemplate]="itemTemplate"
1828
1858
  [itemLinkTemplate]="itemLinkTemplate"
1859
+ [popupSettings]="popupSettings"
1829
1860
  [ngClass]="menuListClasses"
1830
1861
  role="menu">
1831
1862
  </ul>
@@ -1846,7 +1877,7 @@ class ItemComponent {
1846
1877
  <kendo-icon-wrapper [name]="fontIcon(horizontal, rtl)" [svgIcon]="SVGIcon(horizontal, rtl)" class="k-menu-expand-arrow" aria-hidden="true"></kendo-icon-wrapper>
1847
1878
  }
1848
1879
  </ng-template>
1849
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
1880
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
1850
1881
  }
1851
1882
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ItemComponent, decorators: [{
1852
1883
  type: Component,
@@ -1898,6 +1929,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1898
1929
  [index]="index"
1899
1930
  [itemTemplate]="itemTemplate"
1900
1931
  [itemLinkTemplate]="itemLinkTemplate"
1932
+ [popupSettings]="popupSettings"
1901
1933
  [ngClass]="menuListClasses"
1902
1934
  role="menu">
1903
1935
  </ul>
@@ -1948,6 +1980,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1948
1980
  type: Input
1949
1981
  }], itemLinkTemplate: [{
1950
1982
  type: Input
1983
+ }], popupSettings: [{
1984
+ type: Input
1951
1985
  }], link: [{
1952
1986
  type: ViewChild,
1953
1987
  args: ['link', { static: false }]
@@ -2182,9 +2216,10 @@ class MenuComponent extends MenuBase {
2182
2216
  [size]="size" [vertical]="vertical" [rtl]="rtl" [animate]="animate" [openOnClick]="openOnClick"
2183
2217
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
2184
2218
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
2219
+ [popupSettings]="popupSettings"
2185
2220
  [ngClass]="menuClasses">
2186
2221
  </ul>
2187
- `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2222
+ `, isInline: true, dependencies: [{ kind: "component", type: ListComponent, selector: "[kendoMenuList]", inputs: ["appendTo", "items", "level", "index", "animate", "size", "vertical", "rtl", "openOnClick", "itemTemplate", "itemLinkTemplate", "popupSettings"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2188
2223
  }
2189
2224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MenuComponent, decorators: [{
2190
2225
  type: Component,
@@ -2214,6 +2249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2214
2249
  [size]="size" [vertical]="vertical" [rtl]="rtl" [animate]="animate" [openOnClick]="openOnClick"
2215
2250
  [itemTemplate]="itemTemplate.first?.templateRef || menuItemTemplate"
2216
2251
  [itemLinkTemplate]="itemLinkTemplate.first?.templateRef || menuItemLinkTemplate"
2252
+ [popupSettings]="popupSettings"
2217
2253
  [ngClass]="menuClasses">
2218
2254
  </ul>
2219
2255
  `,
@@ -3244,6 +3280,7 @@ class ContextMenuComponent extends MenuBase {
3244
3280
  });
3245
3281
  }
3246
3282
  createPopup(options) {
3283
+ const customClasses = this.popupSettings?.popupClass ? parseCSSClassNames(this.popupSettings.popupClass) : [];
3247
3284
  this.popupRef = this.popupService.open(Object.assign({
3248
3285
  animate: defined(this.popupAnimate) ? this.popupAnimate : true,
3249
3286
  appendTo: this.appendTo,
@@ -3251,7 +3288,8 @@ class ContextMenuComponent extends MenuBase {
3251
3288
  popupAlign: this.popupAlign || DEFAULT_POPUP_ALIGN,
3252
3289
  anchorAlign: this.anchorAlign || DEFAULT_ANCHOR_ALIGN,
3253
3290
  content: this.contentTemplate ? this.contentTemplate.templateRef : this.defaultContentTemplate,
3254
- popupClass: 'k-menu-popup',
3291
+ popupClass: ['k-menu-popup', ...customClasses],
3292
+ margin: this.popupSettings?.margin ?? DEFAULT_MARGIN,
3255
3293
  positionMode: 'absolute'
3256
3294
  }, options));
3257
3295
  const element = this.popupRef.popupElement;
@@ -3343,6 +3381,7 @@ class ContextMenuComponent extends MenuBase {
3343
3381
  [openOnClick]="openOnClick"
3344
3382
  [hoverDelay]="hoverDelay"
3345
3383
  [animate]="animate"
3384
+ [popupSettings]="popupSettings"
3346
3385
  [menuItemTemplate]="itemTemplate.first?.templateRef"
3347
3386
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
3348
3387
  ></kendo-menu>
@@ -3385,6 +3424,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
3385
3424
  [openOnClick]="openOnClick"
3386
3425
  [hoverDelay]="hoverDelay"
3387
3426
  [animate]="animate"
3427
+ [popupSettings]="popupSettings"
3388
3428
  [menuItemTemplate]="itemTemplate.first?.templateRef"
3389
3429
  [menuItemLinkTemplate]="itemLinkTemplate.first?.templateRef"
3390
3430
  ></kendo-menu>
package/menu-base.d.ts CHANGED
@@ -9,6 +9,7 @@ import { OpenOnClickSettings } from './open-on-click-settings';
9
9
  import { ItemTemplateDirective } from './templates/item-template.directive';
10
10
  import { ItemLinkTemplateDirective } from './templates/item-link-template.directive';
11
11
  import { MenuSize } from './size';
12
+ import { PopupSettings } from './rendering/popup-settings';
12
13
  import * as i0 from "@angular/core";
13
14
  /**
14
15
  * @hidden
@@ -48,6 +49,11 @@ export declare class MenuBase {
48
49
  *
49
50
  */
50
51
  size: MenuSize;
52
+ /**
53
+ * Configures the popup settings for the Menu items.
54
+ * Allows customization of the popup class and margin.
55
+ */
56
+ popupSettings: PopupSettings;
51
57
  /**
52
58
  * @hidden
53
59
  */
@@ -65,5 +71,5 @@ export declare class MenuBase {
65
71
  */
66
72
  get rootItems(): any[];
67
73
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuBase, never>;
68
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuBase, "kendo-menu-base", never, { "items": { "alias": "items"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "hoverDelay": { "alias": "hoverDelay"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; }, {}, ["itemTemplate", "itemLinkTemplate", "children"], never, false, never>;
74
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuBase, "kendo-menu-base", never, { "items": { "alias": "items"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "hoverDelay": { "alias": "hoverDelay"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, ["itemTemplate", "itemLinkTemplate", "children"], never, false, never>;
69
75
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-menu",
3
- "version": "21.4.0-develop.1",
3
+ "version": "21.4.0-develop.3",
4
4
  "description": "Kendo UI Angular Menu component",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -19,7 +19,7 @@
19
19
  "package": {
20
20
  "productName": "Kendo UI for Angular",
21
21
  "productCode": "KENDOUIANGULAR",
22
- "publishDate": 1765536325,
22
+ "publishDate": 1765793550,
23
23
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
24
24
  }
25
25
  },
@@ -29,15 +29,15 @@
29
29
  "@angular/core": "18 - 21",
30
30
  "@angular/platform-browser": "18 - 21",
31
31
  "@progress/kendo-licensing": "^1.7.0",
32
- "@progress/kendo-angular-common": "21.4.0-develop.1",
33
- "@progress/kendo-angular-l10n": "21.4.0-develop.1",
34
- "@progress/kendo-angular-icons": "21.4.0-develop.1",
35
- "@progress/kendo-angular-popup": "21.4.0-develop.1",
32
+ "@progress/kendo-angular-common": "21.4.0-develop.3",
33
+ "@progress/kendo-angular-l10n": "21.4.0-develop.3",
34
+ "@progress/kendo-angular-icons": "21.4.0-develop.3",
35
+ "@progress/kendo-angular-popup": "21.4.0-develop.3",
36
36
  "rxjs": "^6.5.3 || ^7.0.0"
37
37
  },
38
38
  "dependencies": {
39
39
  "tslib": "^2.3.1",
40
- "@progress/kendo-angular-schematics": "21.4.0-develop.1"
40
+ "@progress/kendo-angular-schematics": "21.4.0-develop.3"
41
41
  },
42
42
  "schematics": "./schematics/collection.json",
43
43
  "module": "fesm2022/progress-kendo-angular-menu.mjs",
@@ -12,6 +12,7 @@ import { ActionsService } from '../services/actions.service';
12
12
  import { HoverService } from '../services/hover.service';
13
13
  import { ItemsService } from '../services/items.service';
14
14
  import { NavigationService } from '../services/navigation.service';
15
+ import { PopupSettings } from './popup-settings';
15
16
  import * as i0 from "@angular/core";
16
17
  /**
17
18
  * @hidden
@@ -35,6 +36,7 @@ export declare class ListComponent implements OnInit, OnDestroy {
35
36
  openOnClick: any;
36
37
  itemTemplate: TemplateRef<any>;
37
38
  itemLinkTemplate: TemplateRef<any>;
39
+ popupSettings: PopupSettings;
38
40
  private domSubscriptions;
39
41
  constructor(itemsService: ItemsService, hover: HoverService, actions: ActionsService, navigation: NavigationService, renderer: Renderer2, ngZone: NgZone, element: ElementRef);
40
42
  hierarchyIndex(index: number): string;
@@ -46,7 +48,7 @@ export declare class ListComponent implements OnInit, OnDestroy {
46
48
  private nodeItem;
47
49
  private clickHandler;
48
50
  static ɵfac: i0.ɵɵFactoryDeclaration<ListComponent, never>;
49
- static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "[kendoMenuList]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "items": { "alias": "items"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; }, {}, never, never, true, never>;
51
+ static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "[kendoMenuList]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "items": { "alias": "items"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, never, never, true, never>;
50
52
  }
51
53
  /**
52
54
  * @hidden
@@ -72,12 +74,13 @@ export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
72
74
  openOnClick: boolean;
73
75
  itemTemplate: TemplateRef<any>;
74
76
  itemLinkTemplate: TemplateRef<any>;
77
+ popupSettings: PopupSettings;
75
78
  link: ElementRef;
76
79
  popupTemplate: TemplateRef<any>;
77
80
  get disabled(): boolean;
78
81
  get hasPopup(): boolean;
79
82
  get label(): boolean;
80
- get popupSettings(): any;
83
+ get defaultPopupSettings(): any;
81
84
  get horizontal(): boolean;
82
85
  get hasLink(): boolean;
83
86
  get linkTemplate(): TemplateRef<any>;
@@ -115,6 +118,7 @@ export declare class ItemComponent implements OnInit, AfterViewInit, OnDestroy {
115
118
  close(): void;
116
119
  navigate(): void;
117
120
  private setAttribute;
121
+ private getMergedPopupSettings;
118
122
  static ɵfac: i0.ɵɵFactoryDeclaration<ItemComponent, [null, null, null, null, null, null, { optional: true; }]>;
119
- static ɵcmp: i0.ɵɵComponentDeclaration<ItemComponent, "[kendoMenuItem]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "item": { "alias": "item"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "siblingIndex": { "alias": "siblingIndex"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; }, {}, never, never, true, never>;
123
+ static ɵcmp: i0.ɵɵComponentDeclaration<ItemComponent, "[kendoMenuItem]", never, { "appendTo": { "alias": "appendTo"; "required": false; }; "item": { "alias": "item"; "required": false; }; "level": { "alias": "level"; "required": false; }; "index": { "alias": "index"; "required": false; }; "siblingIndex": { "alias": "siblingIndex"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "size": { "alias": "size"; "required": false; }; "vertical": { "alias": "vertical"; "required": false; }; "rtl": { "alias": "rtl"; "required": false; }; "openOnClick": { "alias": "openOnClick"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "itemLinkTemplate": { "alias": "itemLinkTemplate"; "required": false; }; "popupSettings": { "alias": "popupSettings"; "required": false; }; }, {}, never, never, true, never>;
120
124
  }
@@ -2,6 +2,11 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
+ import { Margin } from "@progress/kendo-angular-popup";
6
+ /**
7
+ * @hidden
8
+ */
9
+ export declare const DEFAULT_MARGIN: Margin;
5
10
  /**
6
11
  * @hidden
7
12
  */
@@ -17,6 +22,7 @@ export declare const POPUP_SETTINGS_RTL: {
17
22
  horizontal: string;
18
23
  };
19
24
  animate: string;
25
+ popupClass: string[];
20
26
  };
21
27
  horizontal: {
22
28
  anchor: {
@@ -29,6 +35,7 @@ export declare const POPUP_SETTINGS_RTL: {
29
35
  horizontal: string;
30
36
  };
31
37
  animate: string;
38
+ popupClass: string[];
32
39
  };
33
40
  };
34
41
  /**
@@ -46,6 +53,7 @@ export declare const POPUP_SETTINGS: {
46
53
  horizontal: string;
47
54
  };
48
55
  animate: string;
56
+ popupClass: string[];
49
57
  };
50
58
  horizontal: {
51
59
  anchor: {
@@ -58,5 +66,19 @@ export declare const POPUP_SETTINGS: {
58
66
  horizontal: string;
59
67
  };
60
68
  animate: string;
69
+ popupClass: string[];
61
70
  };
62
71
  };
72
+ /**
73
+ * Settings for the Menu and ContextMenu popups.
74
+ */
75
+ export interface PopupSettings {
76
+ /**
77
+ * The CSS class that will be applied to the popup container.
78
+ */
79
+ popupClass?: string | string[] | object | Set<string>;
80
+ /**
81
+ * The margin of the popup container.
82
+ */
83
+ margin?: Margin;
84
+ }