@progress/kendo-angular-toolbar 16.11.0-develop.2 → 16.11.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.
@@ -3,16 +3,16 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as i0 from '@angular/core';
6
- import { EventEmitter, Injectable, Component, Input, Output, HostBinding, HostListener, Directive, forwardRef, ElementRef, ViewContainerRef, ContentChildren, ViewChild, ViewChildren, isDevMode, NgModule } from '@angular/core';
6
+ import { EventEmitter, Injectable, inject, ElementRef, Directive, Input, Output, forwardRef, ViewContainerRef, Component, ContentChildren, ViewChild, HostBinding, HostListener, isDevMode, ViewChildren, NgModule } from '@angular/core';
7
7
  import { Keys, guid, isDocumentAvailable, ResizeSensorComponent, ResizeBatchService } from '@progress/kendo-angular-common';
8
8
  import * as i1 from '@progress/kendo-angular-l10n';
9
9
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
10
10
  import { validatePackage } from '@progress/kendo-licensing';
11
11
  import { take, filter, takeUntil } from 'rxjs/operators';
12
- import { NgIf, NgTemplateOutlet, NgFor, NgClass, NgStyle } from '@angular/common';
13
12
  import { Subject, Subscription, merge, fromEvent } from 'rxjs';
14
13
  import { moreVerticalIcon, caretAltDownIcon } from '@progress/kendo-svg-icons';
15
14
  import { ButtonComponent, ButtonGroupComponent, DropDownButtonComponent, SplitButtonComponent } from '@progress/kendo-angular-buttons';
15
+ import { NgTemplateOutlet, NgFor, NgIf, NgClass, NgStyle } from '@angular/common';
16
16
  import * as i2 from '@progress/kendo-angular-popup';
17
17
  import { PopupService } from '@progress/kendo-angular-popup';
18
18
  import { IconWrapperComponent, IconsService } from '@progress/kendo-angular-icons';
@@ -24,8 +24,8 @@ const packageMetadata = {
24
24
  name: '@progress/kendo-angular-toolbar',
25
25
  productName: 'Kendo UI for Angular',
26
26
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
27
- publishDate: 1727422886,
28
- version: '16.11.0-develop.2',
27
+ publishDate: 1727428119,
28
+ version: '16.11.0-develop.3',
29
29
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
30
30
  };
31
31
 
@@ -252,6 +252,10 @@ const getStylingClasses = (componentType, stylingOption, previousValue, newValue
252
252
  break;
253
253
  }
254
254
  };
255
+ /**
256
+ * @hidden
257
+ */
258
+ const isElement = (element) => element instanceof Element || element instanceof Document;
255
259
 
256
260
  /**
257
261
  * @hidden
@@ -265,7 +269,7 @@ class NavigationService {
265
269
  this.isOverflowButtonFocused = false;
266
270
  }
267
271
  setRenderedTools(rts) {
268
- this.renderedTools = [...rts];
272
+ this.renderedTools = rts;
269
273
  }
270
274
  click({ context, event: ev }) {
271
275
  if (this.focused.renderedTool !== context && ev) {
@@ -278,7 +282,7 @@ class NavigationService {
278
282
  }
279
283
  moveFocusToPopup() {
280
284
  this.isPopupFocused = true;
281
- this.blurOverflowButton();
285
+ this.resetNavigation();
282
286
  this.focus();
283
287
  }
284
288
  focusNext(ev) {
@@ -355,7 +359,7 @@ class NavigationService {
355
359
  }
356
360
  }
357
361
  getFocusableTools() {
358
- return this.renderedTools.filter(rt => rt.tool.overflows === this.isPopupFocused && rt.tool.canFocus());
362
+ return this.renderedTools.filter(rt => (rt.tool.overflows === this.isPopupFocused) && rt.tool.canFocus());
359
363
  }
360
364
  focus(renderedTool, ev) {
361
365
  // running the code below in onStable fixes issue #2939
@@ -414,9 +418,10 @@ class ToolBarToolComponent {
414
418
  * @hidden
415
419
  */
416
420
  this.responsive = true;
421
+ this.element = inject(ElementRef);
417
422
  }
418
423
  get toolbarDisplay() {
419
- return this.overflows ? 'none' : 'inline-block';
424
+ return this.overflows ? 'none' : 'inline-flex';
420
425
  }
421
426
  get overflowDisplay() {
422
427
  return this.overflows ? 'block' : 'none';
@@ -448,17 +453,14 @@ class ToolBarToolComponent {
448
453
  return false;
449
454
  }
450
455
  }
451
- ToolBarToolComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
452
- ToolBarToolComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarToolComponent, isStandalone: true, selector: "toolbar-tool", inputs: { responsive: "responsive" }, ngImport: i0, template: ``, isInline: true });
456
+ ToolBarToolComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
457
+ ToolBarToolComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarToolComponent, isStandalone: true, inputs: { responsive: "responsive" }, ngImport: i0 });
453
458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarToolComponent, decorators: [{
454
- type: Component,
459
+ type: Directive,
455
460
  args: [{
456
- // eslint-disable-next-line @angular-eslint/component-selector
457
- selector: 'toolbar-tool',
458
- template: ``,
459
461
  standalone: true
460
462
  }]
461
- }], propDecorators: { responsive: [{
463
+ }], ctorParameters: function () { return []; }, propDecorators: { responsive: [{
462
464
  type: Input
463
465
  }] } });
464
466
 
@@ -530,125 +532,150 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
530
532
  type: Injectable
531
533
  }] });
532
534
 
535
+ /**
536
+ * @hidden
537
+ */
538
+ class ToolbarToolsService {
539
+ constructor() {
540
+ this.renderedToolsChange = new Subject();
541
+ this.overflowToolsChange = new Subject();
542
+ this.renderedTools = [];
543
+ this.overflowTools = [];
544
+ this.allTools = [];
545
+ }
546
+ }
547
+ ToolbarToolsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarToolsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
548
+ ToolbarToolsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarToolsService });
549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolbarToolsService, decorators: [{
550
+ type: Injectable
551
+ }] });
552
+
533
553
  const MIN_SPACER_WIDTH = 18;
534
554
  /**
535
555
  * @hidden
536
556
  */
537
557
  class ToolBarRendererComponent {
538
- constructor(element, renderer, rendererService, refreshService) {
539
- this.element = element;
558
+ constructor(renderer, rendererService, refreshService, toolsService, viewContainer, navigationService) {
540
559
  this.renderer = renderer;
541
560
  this.rendererService = rendererService;
542
561
  this.refreshService = refreshService;
562
+ this.toolsService = toolsService;
563
+ this.viewContainer = viewContainer;
564
+ this.navigationService = navigationService;
543
565
  this.rendererClick = new EventEmitter();
544
- this.hostClass = true;
545
- this.rendererService.element = element;
566
+ this.onClick = (ev) => {
567
+ this.rendererClick.emit({ context: this, event: ev });
568
+ };
569
+ }
570
+ get isSpacer() {
571
+ return this.tool && this.tool.__isSpacer;
572
+ }
573
+ ngOnInit() {
574
+ this.internalComponentRef = this.viewContainer.get(0).rootNodes[0];
575
+ this.element = this.tool.element;
576
+ this.internalComponentRef.addEventListener('click', this.onClick);
577
+ this.rendererService.element = this.element;
546
578
  this.rendererService.renderer = this;
547
579
  this.refreshSubscription = this.refreshService.onRefresh.subscribe((tool) => {
548
580
  if (this.tool === tool) {
549
581
  this.refresh();
550
582
  }
551
583
  });
552
- }
553
- get spacerClass() {
554
- return this.location === 'toolbar' && this.isSpacer;
555
- }
556
- get isSpacer() {
557
- return this.tool && this.tool.__isSpacer;
558
- }
559
- onClick(ev) {
560
- this.rendererClick.emit({ context: this, event: ev });
561
- }
562
- ngOnInit() {
563
584
  if (this.resizable) {
564
585
  if (this.location === 'toolbar') {
565
586
  this.template = this.tool.toolbarTemplate;
566
- this.renderer.setStyle(this.element.nativeElement, 'visibility', 'hidden');
567
- this.renderer.setStyle(this.element.nativeElement, 'display', 'none');
587
+ if (isElement(this.internalComponentRef)) {
588
+ this.renderer.setStyle(this.internalComponentRef, 'visibility', 'hidden');
589
+ this.renderer.setStyle(this.internalComponentRef, 'display', 'none');
590
+ }
568
591
  }
569
592
  else {
570
593
  this.template = this.tool.popupTemplate;
571
- this.renderer.setStyle(this.element.nativeElement, 'display', 'none');
594
+ if (isElement(this.internalComponentRef)) {
595
+ this.renderer.setStyle(this.internalComponentRef, 'display', 'none');
596
+ }
572
597
  }
573
598
  }
574
599
  else {
575
600
  this.tool.overflows = false;
576
601
  this.template = this.tool.toolbarTemplate;
577
- this.renderer.setStyle(this.element.nativeElement, 'visibility', 'visible');
578
- this.renderer.setStyle(this.element.nativeElement, 'display', 'inline-block');
602
+ if (isElement(this.internalComponentRef)) {
603
+ this.renderer.setStyle(this.internalComponentRef, 'visibility', 'visible');
604
+ this.renderer.setStyle(this.internalComponentRef, 'display', 'inline-flex');
605
+ }
579
606
  }
580
607
  }
581
608
  ngOnDestroy() {
582
609
  this.refreshSubscription.unsubscribe();
610
+ this.internalComponentRef.removeEventListener('click', this.onClick);
583
611
  }
584
612
  ngAfterViewInit() {
585
613
  if (this.resizable) {
586
614
  this.refresh();
587
615
  }
616
+ this.updateTools();
588
617
  }
589
618
  /**
590
619
  * @hidden
591
620
  */
592
621
  get width() {
622
+ if (!isElement(this.internalComponentRef)) {
623
+ return 0;
624
+ }
593
625
  if (this.isSpacer) {
594
626
  return MIN_SPACER_WIDTH;
595
627
  }
596
- return this.tool.overflows ? 0 : outerWidth(this.element.nativeElement);
628
+ return this.tool.overflows ? 0 : outerWidth(this.internalComponentRef);
597
629
  }
598
- /**
599
- * @hidden
600
- */
601
630
  isDisplayed() {
602
- return this.element.nativeElement.style.display !== 'none';
631
+ return this.internalComponentRef.style.display !== 'none';
603
632
  }
604
- /**
605
- * @hidden
606
- */
607
633
  refresh() {
608
634
  if (this.resizable) {
635
+ if (!isElement(this.internalComponentRef)) {
636
+ return;
637
+ }
609
638
  if (this.location === 'toolbar') {
610
- this.renderer.setStyle(this.element.nativeElement, 'visibility', this.tool.visibility);
611
- this.renderer.setStyle(this.element.nativeElement, 'display', this.tool.toolbarDisplay);
639
+ this.renderer.setStyle(this.internalComponentRef, 'visibility', this.tool.visibility);
640
+ this.renderer.setStyle(this.internalComponentRef, 'display', this.tool.toolbarDisplay);
612
641
  }
613
642
  else {
614
- this.renderer.setStyle(this.element.nativeElement, 'display', this.tool.overflowDisplay);
643
+ this.renderer.setStyle(this.internalComponentRef, 'display', this.tool.overflowDisplay);
615
644
  }
645
+ this.updateTools();
616
646
  }
617
647
  }
618
- /**
619
- * @hidden
620
- */
621
648
  setAttribute(element, attr, value) {
622
649
  this.renderer.setAttribute(element, attr, value);
623
650
  }
651
+ updateTools() {
652
+ const isInToolbar = this.toolsService.renderedTools.some(t => t.tool === this.tool);
653
+ const isInPopup = this.toolsService.overflowTools.some(t => t.tool === this.tool);
654
+ if (this.location === 'toolbar') {
655
+ isInPopup && (this.toolsService.overflowTools = this.toolsService.overflowTools.filter(t => t.tool !== this.tool));
656
+ !isInToolbar && this.toolsService.renderedTools.push(this);
657
+ }
658
+ else {
659
+ if (!isInPopup) {
660
+ this.toolsService.overflowTools.push(this);
661
+ this.toolsService.overflowTools.sort((t1, t2) => {
662
+ // ensures correct navigation order in Popup
663
+ return this.toolsService.allTools.indexOf(t1.tool) - this.toolsService.allTools.indexOf(t2.tool);
664
+ });
665
+ }
666
+ }
667
+ }
624
668
  }
625
- ToolBarRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarRendererComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: RendererService }, { token: RefreshService }], target: i0.ɵɵFactoryTarget.Component });
626
- ToolBarRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarRendererComponent, isStandalone: true, selector: "kendo-toolbar-renderer", inputs: { tool: "tool", location: "location", resizable: "resizable" }, outputs: { rendererClick: "rendererClick" }, host: { listeners: { "click": "onClick($event)" }, properties: { "class.k-spacer": "this.spacerClass", "class.k-toolbar-renderer": "this.hostClass" } }, providers: [RendererService], exportAs: ["kendoToolBarRenderer"], ngImport: i0, template: `
627
- <ng-container *ngIf="location === 'toolbar'">
628
- <ng-template [ngTemplateOutlet]="template"></ng-template>
629
- </ng-container>
630
- <ng-container *ngIf="location === 'overflow' && tool.responsive">
631
- <ng-template [ngTemplateOutlet]="template"></ng-template>
632
- </ng-container>
633
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
669
+ ToolBarRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarRendererComponent, deps: [{ token: i0.Renderer2 }, { token: RendererService }, { token: RefreshService }, { token: ToolbarToolsService }, { token: i0.ViewContainerRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Directive });
670
+ ToolBarRendererComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarRendererComponent, isStandalone: true, selector: "[kendoToolbarRenderer]", inputs: { tool: "tool", location: "location", resizable: "resizable" }, outputs: { rendererClick: "rendererClick" }, providers: [RendererService], ngImport: i0 });
634
671
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarRendererComponent, decorators: [{
635
- type: Component,
672
+ type: Directive,
636
673
  args: [{
637
- exportAs: 'kendoToolBarRenderer',
638
674
  providers: [RendererService],
639
- selector: 'kendo-toolbar-renderer',
640
- template: `
641
- <ng-container *ngIf="location === 'toolbar'">
642
- <ng-template [ngTemplateOutlet]="template"></ng-template>
643
- </ng-container>
644
- <ng-container *ngIf="location === 'overflow' && tool.responsive">
645
- <ng-template [ngTemplateOutlet]="template"></ng-template>
646
- </ng-container>
647
- `,
648
675
  standalone: true,
649
- imports: [NgIf, NgTemplateOutlet]
676
+ selector: '[kendoToolbarRenderer]'
650
677
  }]
651
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: RendererService }, { type: RefreshService }]; }, propDecorators: { tool: [{
678
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: RendererService }, { type: RefreshService }, { type: ToolbarToolsService }, { type: i0.ViewContainerRef }, { type: NavigationService }]; }, propDecorators: { tool: [{
652
679
  type: Input
653
680
  }], location: [{
654
681
  type: Input
@@ -656,15 +683,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
656
683
  type: Input
657
684
  }], rendererClick: [{
658
685
  type: Output
659
- }], spacerClass: [{
660
- type: HostBinding,
661
- args: ['class.k-spacer']
662
- }], hostClass: [{
663
- type: HostBinding,
664
- args: ['class.k-toolbar-renderer']
665
- }], onClick: [{
666
- type: HostListener,
667
- args: ['click', ['$event']]
668
686
  }] } });
669
687
 
670
688
  /**
@@ -728,7 +746,7 @@ const getInitialPopupSettings = (isRtl) => ({
728
746
  class ToolBarComponent {
729
747
  constructor(localization, popupService, refreshService, navigationService,
730
748
  // Needs to be public as it is being accessed in the Editor component
731
- element, zone, renderer, _cdr) {
749
+ element, zone, renderer, _cdr, toolsService) {
732
750
  this.localization = localization;
733
751
  this.popupService = popupService;
734
752
  this.refreshService = refreshService;
@@ -737,6 +755,7 @@ class ToolBarComponent {
737
755
  this.zone = zone;
738
756
  this.renderer = renderer;
739
757
  this._cdr = _cdr;
758
+ this.toolsService = toolsService;
740
759
  /**
741
760
  * Hides the overflowing tools in a popup.
742
761
  */
@@ -875,7 +894,16 @@ class ToolBarComponent {
875
894
  get resizableClass() {
876
895
  return this.overflow;
877
896
  }
897
+ ngAfterContentInit() {
898
+ this.toolsService.allTools = this.allTools.toArray();
899
+ this.subscriptions.add(this.allTools.changes.subscribe(changes => {
900
+ this.toolsService.allTools = this.allTools.toArray();
901
+ this.zone.onStable.pipe(take(1)).subscribe(() => this.onResize());
902
+ }));
903
+ }
878
904
  ngAfterViewInit() {
905
+ this.toolsService.renderedToolsChange.next(this.toolsService.renderedTools);
906
+ this.toolsService.overflowToolsChange.next(this.toolsService.overflowTools);
879
907
  const element = this.element.nativeElement;
880
908
  if (!element.getAttribute('tabindex')) {
881
909
  this.element.nativeElement.setAttribute('tabindex', '0');
@@ -927,7 +955,7 @@ class ToolBarComponent {
927
955
  });
928
956
  });
929
957
  if (this.overflow) {
930
- this.subscriptions.add(merge(this.resizeSensor.resize, this.renderedTools.changes).subscribe(() => this.onResize()));
958
+ this.subscriptions.add(merge(this.resizeSensor.resize, this.toolsService.renderedToolsChange).subscribe(() => this.onResize()));
931
959
  this.navigationService.overflowButton = this.overflowButton;
932
960
  // because of https://github.com/telerik/kendo-angular-buttons/pull/276
933
961
  // button icons are not rendered until onResize() is called
@@ -939,8 +967,7 @@ class ToolBarComponent {
939
967
  });
940
968
  });
941
969
  }
942
- this.navigationService.setRenderedTools(this.renderedTools.toArray());
943
- this.subscriptions.add(this.renderedTools.changes.subscribe((rts) => this.navigationService.setRenderedTools(rts.toArray())));
970
+ this.navigationService.setRenderedTools(this.toolsService.renderedTools);
944
971
  this.handleClasses(this.size, 'size');
945
972
  }
946
973
  ngOnInit() {
@@ -1045,7 +1072,6 @@ class ToolBarComponent {
1045
1072
  onPopupOpen() {
1046
1073
  this.zone.runOutsideAngular(() => {
1047
1074
  this.overflowKeydownListener = this.renderer.listen(this.popupRef.popupElement, 'keydown', (ev) => {
1048
- const currentTool = this.overflowRenderedTools.toArray().find(tool => closest(ev.target, (el) => el === tool.element.nativeElement));
1049
1075
  switch (ev.keyCode) {
1050
1076
  case Keys.ArrowUp:
1051
1077
  this.zone.run(() => {
@@ -1073,7 +1099,7 @@ class ToolBarComponent {
1073
1099
  case Keys.Enter:
1074
1100
  case Keys.Space:
1075
1101
  this.zone.run(() => {
1076
- if (currentTool) {
1102
+ if (ev.target.closest('.k-menu-item')) {
1077
1103
  ev.preventDefault();
1078
1104
  ev.target.click();
1079
1105
  ev.target.focus();
@@ -1086,11 +1112,11 @@ class ToolBarComponent {
1086
1112
  });
1087
1113
  });
1088
1114
  this.cancelRenderedToolsSubscription$.next();
1115
+ this.navigationService.setRenderedTools(this.toolsService.overflowTools);
1089
1116
  this.navigationService.moveFocusToPopup();
1090
- this.navigationService.setRenderedTools(this.overflowRenderedTools.toArray());
1091
- this.overflowRenderedTools.changes
1117
+ this.toolsService.overflowToolsChange
1092
1118
  .pipe(takeUntil(this.cancelRenderedToolsSubscription$))
1093
- .subscribe((rts) => this.navigationService.setRenderedTools(rts.toArray()));
1119
+ .subscribe((rts) => this.navigationService.setRenderedTools(rts));
1094
1120
  this.renderer.setAttribute(this.overflowButton.nativeElement, 'aria-controls', this.popupId);
1095
1121
  }
1096
1122
  /**
@@ -1098,10 +1124,10 @@ class ToolBarComponent {
1098
1124
  */
1099
1125
  onPopupClose() {
1100
1126
  this.cancelRenderedToolsSubscription$.next();
1101
- this.navigationService.setRenderedTools(this.renderedTools.toArray());
1102
- this.renderedTools.changes
1127
+ this.navigationService.setRenderedTools(this.toolsService.renderedTools);
1128
+ this.toolsService.renderedToolsChange
1103
1129
  .pipe(takeUntil(this.cancelRenderedToolsSubscription$))
1104
- .subscribe((rts) => this.navigationService.setRenderedTools(rts.toArray()));
1130
+ .subscribe((rts) => this.navigationService.setRenderedTools(rts));
1105
1131
  this.navigationService.moveFocusToToolBar();
1106
1132
  if (this.overflowKeydownListener) {
1107
1133
  this.overflowKeydownListener();
@@ -1142,7 +1168,7 @@ class ToolBarComponent {
1142
1168
  return this.cachedGap;
1143
1169
  }
1144
1170
  get childrenWidth() {
1145
- const width = this.renderedTools.reduce((totalWidth, tool) => tool.width + totalWidth + (tool.isDisplayed() ? this.gap : 0), 0);
1171
+ const width = this.toolsService.renderedTools.reduce((totalWidth, tool) => tool.width + totalWidth + (tool.isDisplayed() ? this.gap : 0), 0);
1146
1172
  return Math.ceil(width);
1147
1173
  }
1148
1174
  get visibleTools() {
@@ -1185,7 +1211,10 @@ class ToolBarComponent {
1185
1211
  }
1186
1212
  hideLastVisibleTool() {
1187
1213
  const tool = this.visibleTools[this.visibleTools.length - 1];
1188
- const renderedElement = this.renderedTools.find((r) => {
1214
+ if (!tool) {
1215
+ return null;
1216
+ }
1217
+ const renderedElement = this.toolsService.renderedTools.find((r) => {
1189
1218
  return r.tool === tool;
1190
1219
  });
1191
1220
  const width = renderedElement.width;
@@ -1195,18 +1224,20 @@ class ToolBarComponent {
1195
1224
  }
1196
1225
  showFirstHiddenTool(containerWidth, childrenWidth) {
1197
1226
  const tool = this.overflowTools[0];
1198
- const renderedElement = this.renderedTools.find(r => r.tool === tool);
1227
+ if (!tool) {
1228
+ return null;
1229
+ }
1230
+ const renderedElement = this.toolsService.renderedTools.find((r) => r.tool === tool);
1199
1231
  tool.overflows = false;
1200
1232
  tool.visibility = 'hidden';
1201
1233
  this.refreshService.refresh(tool);
1202
1234
  if (containerWidth > childrenWidth + renderedElement.width) {
1203
1235
  tool.visibility = 'visible';
1204
- this.refreshService.refresh(tool);
1205
1236
  }
1206
1237
  else {
1207
1238
  tool.overflows = true;
1208
- this.refreshService.refresh(tool);
1209
1239
  }
1240
+ this.refreshService.refresh(tool);
1210
1241
  return renderedElement.width; // returns 0 if `overflows` is true
1211
1242
  }
1212
1243
  setPopupContentDimensions() {
@@ -1251,30 +1282,29 @@ class ToolBarComponent {
1251
1282
  return classes;
1252
1283
  }
1253
1284
  }
1254
- ToolBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PopupService }, { token: RefreshService }, { token: NavigationService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1285
+ ToolBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PopupService }, { token: RefreshService }, { token: NavigationService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ToolbarToolsService }], target: i0.ɵɵFactoryTarget.Component });
1255
1286
  ToolBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarComponent, isStandalone: true, selector: "kendo-toolbar", inputs: { overflow: "overflow", resizable: "resizable", popupSettings: "popupSettings", tabindex: "tabindex", size: "size", tabIndex: "tabIndex" }, outputs: { open: "open", close: "close" }, host: { listeners: { "focus": "onFocus($event)", "focusout": "onFocusOut($event)" }, properties: { "class.k-toolbar": "this.hostClass", "attr.role": "this.role", "attr.dir": "this.getDir", "class.k-toolbar-resizable": "this.resizableClass" } }, providers: [
1256
1287
  RefreshService,
1257
1288
  NavigationService,
1258
1289
  LocalizationService,
1290
+ ToolbarToolsService,
1259
1291
  {
1260
1292
  provide: L10N_PREFIX,
1261
1293
  useValue: 'kendo.toolbar'
1262
1294
  }
1263
- ], queries: [{ propertyName: "allTools", predicate: ToolBarToolComponent }], viewQueries: [{ propertyName: "overflowButton", first: true, predicate: ["overflowButton"], descendants: true, read: ElementRef }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "resizeSensor", first: true, predicate: ["resizeSensor"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "renderedTools", predicate: ["toolbarRenderer"], descendants: true }, { propertyName: "overflowRenderedTools", predicate: ["overflowRenderer"], descendants: true }], exportAs: ["kendoToolBar"], usesOnChanges: true, ngImport: i0, template: `
1295
+ ], queries: [{ propertyName: "allTools", predicate: ToolBarToolComponent }], viewQueries: [{ propertyName: "overflowButton", first: true, predicate: ["overflowButton"], descendants: true, read: ElementRef }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }, { propertyName: "resizeSensor", first: true, predicate: ["resizeSensor"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], exportAs: ["kendoToolBar"], usesOnChanges: true, ngImport: i0, template: `
1264
1296
  <ng-container kendoToolbarLocalizedMessages
1265
1297
  i18n-moreToolsTitle="kendo.toolbar.moreToolsTitle|The title of the **more tools** button in a responsive ToolBar"
1266
1298
  moreToolsTitle="More tools"
1267
1299
  >
1268
1300
  </ng-container>
1269
- <ng-container *ngFor="let tool of allTools; let index = index">
1270
- <kendo-toolbar-renderer
1271
- #toolbarRenderer
1272
- (rendererClick)="onRendererClick($event)"
1273
- [location]="'toolbar'"
1274
- [resizable]="overflow"
1275
- [tool]="tool"
1276
- ></kendo-toolbar-renderer>
1277
- </ng-container>
1301
+ <ng-container *ngFor="let tool of allTools; let index = index"
1302
+ kendoToolbarRenderer
1303
+ [tool]="tool"
1304
+ location="toolbar"
1305
+ [resizable]="overflow"
1306
+ (rendererClick)="onRendererClick($event)"
1307
+ [ngTemplateOutlet]="tool.toolbarTemplate"></ng-container>
1278
1308
  <button
1279
1309
  kendoButton
1280
1310
  fillMode="flat"
@@ -1303,20 +1333,19 @@ ToolBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", versi
1303
1333
  role="menu"
1304
1334
  [id]="popupId"
1305
1335
  [attr.aria-labelledby]="overflowBtnId">
1306
- <ng-container *ngFor="let tool of allTools; let index = index">
1307
- <kendo-toolbar-renderer
1308
- #overflowRenderer
1309
- (rendererClick)="onRendererClick($event)"
1310
- [location]="'overflow'"
1311
- [resizable]="overflow"
1312
- [tool]="tool"
1313
- ></kendo-toolbar-renderer>
1314
- </ng-container>
1336
+ <ng-template
1337
+ *ngFor="let tool of overflowTools; let index = index"
1338
+ kendoToolbarRenderer
1339
+ [tool]="tool"
1340
+ location="overflow"
1341
+ [resizable]="overflow"
1342
+ (rendererClick)="onRendererClick($event)"
1343
+ [ngTemplateOutlet]="tool.popupTemplate"></ng-template>
1315
1344
  </div>
1316
1345
  </ng-template>
1317
1346
  <ng-container #container></ng-container>
1318
1347
  <kendo-resize-sensor *ngIf="overflow" #resizeSensor></kendo-resize-sensor>
1319
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedToolbarMessagesDirective, selector: "[kendoToolbarLocalizedMessages]" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ToolBarRendererComponent, selector: "kendo-toolbar-renderer", inputs: ["tool", "location", "resizable"], outputs: ["rendererClick"], exportAs: ["kendoToolBarRenderer"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }] });
1348
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: LocalizedToolbarMessagesDirective, selector: "[kendoToolbarLocalizedMessages]" }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: ToolBarRendererComponent, selector: "[kendoToolbarRenderer]", inputs: ["tool", "location", "resizable"], outputs: ["rendererClick"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }] });
1320
1349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarComponent, decorators: [{
1321
1350
  type: Component,
1322
1351
  args: [{
@@ -1325,6 +1354,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1325
1354
  RefreshService,
1326
1355
  NavigationService,
1327
1356
  LocalizationService,
1357
+ ToolbarToolsService,
1328
1358
  {
1329
1359
  provide: L10N_PREFIX,
1330
1360
  useValue: 'kendo.toolbar'
@@ -1337,15 +1367,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1337
1367
  moreToolsTitle="More tools"
1338
1368
  >
1339
1369
  </ng-container>
1340
- <ng-container *ngFor="let tool of allTools; let index = index">
1341
- <kendo-toolbar-renderer
1342
- #toolbarRenderer
1343
- (rendererClick)="onRendererClick($event)"
1344
- [location]="'toolbar'"
1345
- [resizable]="overflow"
1346
- [tool]="tool"
1347
- ></kendo-toolbar-renderer>
1348
- </ng-container>
1370
+ <ng-container *ngFor="let tool of allTools; let index = index"
1371
+ kendoToolbarRenderer
1372
+ [tool]="tool"
1373
+ location="toolbar"
1374
+ [resizable]="overflow"
1375
+ (rendererClick)="onRendererClick($event)"
1376
+ [ngTemplateOutlet]="tool.toolbarTemplate"></ng-container>
1349
1377
  <button
1350
1378
  kendoButton
1351
1379
  fillMode="flat"
@@ -1374,24 +1402,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1374
1402
  role="menu"
1375
1403
  [id]="popupId"
1376
1404
  [attr.aria-labelledby]="overflowBtnId">
1377
- <ng-container *ngFor="let tool of allTools; let index = index">
1378
- <kendo-toolbar-renderer
1379
- #overflowRenderer
1380
- (rendererClick)="onRendererClick($event)"
1381
- [location]="'overflow'"
1382
- [resizable]="overflow"
1383
- [tool]="tool"
1384
- ></kendo-toolbar-renderer>
1385
- </ng-container>
1405
+ <ng-template
1406
+ *ngFor="let tool of overflowTools; let index = index"
1407
+ kendoToolbarRenderer
1408
+ [tool]="tool"
1409
+ location="overflow"
1410
+ [resizable]="overflow"
1411
+ (rendererClick)="onRendererClick($event)"
1412
+ [ngTemplateOutlet]="tool.popupTemplate"></ng-template>
1386
1413
  </div>
1387
1414
  </ng-template>
1388
1415
  <ng-container #container></ng-container>
1389
1416
  <kendo-resize-sensor *ngIf="overflow" #resizeSensor></kendo-resize-sensor>
1390
1417
  `,
1391
1418
  standalone: true,
1392
- imports: [LocalizedToolbarMessagesDirective, NgFor, ToolBarRendererComponent, NgIf, ButtonComponent, NgClass, ResizeSensorComponent]
1419
+ imports: [NgTemplateOutlet, LocalizedToolbarMessagesDirective, NgFor, ToolBarRendererComponent, NgIf, ButtonComponent, NgClass, ResizeSensorComponent]
1393
1420
  }]
1394
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i2.PopupService }, { type: RefreshService }, { type: NavigationService }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { overflow: [{
1421
+ }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i2.PopupService }, { type: RefreshService }, { type: NavigationService }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: ToolbarToolsService }]; }, propDecorators: { overflow: [{
1395
1422
  type: Input
1396
1423
  }], resizable: [{
1397
1424
  type: Input
@@ -1423,12 +1450,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1423
1450
  }], container: [{
1424
1451
  type: ViewChild,
1425
1452
  args: ['container', { read: ViewContainerRef, static: true }]
1426
- }], renderedTools: [{
1427
- type: ViewChildren,
1428
- args: ['toolbarRenderer']
1429
- }], overflowRenderedTools: [{
1430
- type: ViewChildren,
1431
- args: ['overflowRenderer']
1432
1453
  }], hostClass: [{
1433
1454
  type: HostBinding,
1434
1455
  args: ['class.k-toolbar']
@@ -2015,8 +2036,9 @@ ToolBarButtonGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
2015
2036
  </kendo-buttongroup>
2016
2037
  </ng-template>
2017
2038
  <ng-template #popupTemplate>
2018
- <ng-container *ngFor="let button of buttonComponents">
2019
- <div #listItem
2039
+ <div
2040
+ *ngFor="let button of buttonComponents"
2041
+ #listItem
2020
2042
  tabindex="-1"
2021
2043
  role="menuitem"
2022
2044
  class="k-item k-menu-item"
@@ -2037,7 +2059,6 @@ ToolBarButtonGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
2037
2059
  <span *ngIf="button.overflowOptions.text" class="k-menu-link-text">{{button.overflowOptions.text}}</span>
2038
2060
  </span>
2039
2061
  </div>
2040
- </ng-container>
2041
2062
  </ng-template>
2042
2063
  `, isInline: true, dependencies: [{ kind: "component", type: ButtonGroupComponent, selector: "kendo-buttongroup", inputs: ["disabled", "selection", "width", "tabIndex", "navigable"], outputs: ["navigate"], exportAs: ["kendoButtonGroup"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
2043
2064
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarButtonGroupComponent, decorators: [{
@@ -2084,8 +2105,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2084
2105
  </kendo-buttongroup>
2085
2106
  </ng-template>
2086
2107
  <ng-template #popupTemplate>
2087
- <ng-container *ngFor="let button of buttonComponents">
2088
- <div #listItem
2108
+ <div
2109
+ *ngFor="let button of buttonComponents"
2110
+ #listItem
2089
2111
  tabindex="-1"
2090
2112
  role="menuitem"
2091
2113
  class="k-item k-menu-item"
@@ -2106,7 +2128,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
2106
2128
  <span *ngIf="button.overflowOptions.text" class="k-menu-link-text">{{button.overflowOptions.text}}</span>
2107
2129
  </span>
2108
2130
  </div>
2109
- </ng-container>
2110
2131
  </ng-template>
2111
2132
  `,
2112
2133
  standalone: true,
@@ -3209,14 +3230,22 @@ class ToolBarSpacerComponent extends ToolBarToolComponent {
3209
3230
  }
3210
3231
  }
3211
3232
  ToolBarSpacerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarSpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3212
- ToolBarSpacerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarSpacerComponent, isStandalone: true, selector: "kendo-toolbar-spacer", providers: [{ provide: ToolBarToolComponent, useExisting: forwardRef(() => ToolBarSpacerComponent) }], viewQueries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbarTemplate"], descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], exportAs: ["kendoToolBarSpacer"], usesInheritance: true, ngImport: i0, template: ``, isInline: true });
3233
+ ToolBarSpacerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ToolBarSpacerComponent, isStandalone: true, selector: "kendo-toolbar-spacer", providers: [{ provide: ToolBarToolComponent, useExisting: forwardRef(() => ToolBarSpacerComponent) }], viewQueries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbarTemplate"], descendants: true, static: true }, { propertyName: "popupTemplate", first: true, predicate: ["popupTemplate"], descendants: true, static: true }], exportAs: ["kendoToolBarSpacer"], usesInheritance: true, ngImport: i0, template: `
3234
+ <ng-template #toolbarTemplate>
3235
+ <div class="k-spacer"></div>
3236
+ </ng-template>
3237
+ `, isInline: true });
3213
3238
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarSpacerComponent, decorators: [{
3214
3239
  type: Component,
3215
3240
  args: [{
3216
3241
  exportAs: 'kendoToolBarSpacer',
3217
3242
  providers: [{ provide: ToolBarToolComponent, useExisting: forwardRef(() => ToolBarSpacerComponent) }],
3218
3243
  selector: 'kendo-toolbar-spacer',
3219
- template: ``,
3244
+ template: `
3245
+ <ng-template #toolbarTemplate>
3246
+ <div class="k-spacer"></div>
3247
+ </ng-template>
3248
+ `,
3220
3249
  standalone: true
3221
3250
  }]
3222
3251
  }], ctorParameters: function () { return []; }, propDecorators: { toolbarTemplate: [{
@@ -3293,7 +3322,7 @@ class ToolBarModule {
3293
3322
  }
3294
3323
  ToolBarModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
3295
3324
  ToolBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: ToolBarModule, imports: [ToolBarComponent, ToolbarCustomMessagesComponent, ToolBarButtonComponent, ToolBarButtonGroupComponent, ToolBarDropDownButtonComponent, ToolBarSeparatorComponent, ToolBarSpacerComponent, ToolBarSplitButtonComponent, ToolBarToolComponent], exports: [ToolBarComponent, ToolbarCustomMessagesComponent, ToolBarButtonComponent, ToolBarButtonGroupComponent, ToolBarDropDownButtonComponent, ToolBarSeparatorComponent, ToolBarSpacerComponent, ToolBarSplitButtonComponent, ToolBarToolComponent] });
3296
- ToolBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarModule, providers: [IconsService, PopupService, ResizeBatchService], imports: [KENDO_TOOLBAR] });
3325
+ ToolBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarModule, providers: [IconsService, PopupService, ResizeBatchService], imports: [ToolBarComponent, ToolbarCustomMessagesComponent, ToolBarButtonComponent, ToolBarButtonGroupComponent, ToolBarDropDownButtonComponent, ToolBarSeparatorComponent, ToolBarSpacerComponent, ToolBarSplitButtonComponent] });
3297
3326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ToolBarModule, decorators: [{
3298
3327
  type: NgModule,
3299
3328
  args: [{