@progress/kendo-angular-layout 21.2.0-develop.9 → 21.3.0-develop.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@ import { Component, ElementRef, Input, NgZone, Renderer2, TemplateRef, Output, E
7
7
  import { closestItem, itemIndex } from '../common/dom-queries';
8
8
  import { DRAWER_ITEM_INDEX } from './models/constants';
9
9
  import { DrawerService } from './drawer.service';
10
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
10
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
11
11
  import { ACTIVE_NESTED_LINK_SELECTOR, nestedLink } from './util';
12
12
  import { DrawerListSelectEvent } from './events/drawer-list-select.event';
13
13
  import { DrawerItemComponent } from './item.component';
@@ -52,7 +52,7 @@ export class DrawerListComponent {
52
52
  const nativeElement = this.element.nativeElement;
53
53
  this.subscriptions.add(this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this)));
54
54
  this.subscriptions.add(this.renderer.listen(nativeElement, 'keydown', (e) => {
55
- const code = normalizeNumpadKeys(e);
55
+ const code = normalizeKeys(e);
56
56
  const isEnterOrSpace = code === Keys.Enter || code === Keys.Space;
57
57
  const isArrowUpOrDown = code === Keys.ArrowUp || code === Keys.ArrowDown;
58
58
  if (isEnterOrSpace) {
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1764346534,
14
- version: '21.2.0-develop.9',
13
+ publishDate: 1764778665,
14
+ version: '21.3.0-develop.1',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
16
16
  };
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, ViewChildren, isDevMode } from '@angular/core';
6
6
  import { LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
7
- import { Keys, shouldShowValidationUI, getLicenseMessage, WatermarkOverlayComponent, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, shouldShowValidationUI, getLicenseMessage, WatermarkOverlayComponent, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { validatePackage } from '@progress/kendo-licensing';
9
9
  import { packageMetadata } from '../package-metadata';
10
10
  import { PanelBarExpandMode } from './panelbar-expand-mode';
@@ -268,7 +268,7 @@ export class PanelBarComponent {
268
268
  onComponentKeyDown(event) {
269
269
  if (event.target === this.elementRef.nativeElement) {
270
270
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
271
- const code = normalizeNumpadKeys(event);
271
+ const code = normalizeKeys(event);
272
272
  if (code === Keys.Space || code === Keys.ArrowUp || code === Keys.ArrowDown ||
273
273
  code === Keys.ArrowLeft || code === Keys.ArrowRight || code === Keys.Home ||
274
274
  code === Keys.End || code === Keys.PageUp || code === Keys.PageDown) {
@@ -5,7 +5,7 @@
5
5
  /* eslint-disable @typescript-eslint/no-explicit-any */
6
6
  import { ChangeDetectorRef, Component, ElementRef, Host, HostBinding, Input, Renderer2 } from '@angular/core';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
- import { DraggableDirective, Keys, isObjectPresent, normalizeNumpadKeys, parseAttributes, removeHTMLAttributes, setHTMLAttributes } from '@progress/kendo-angular-common';
8
+ import { DraggableDirective, Keys, isObjectPresent, normalizeKeys, parseAttributes, removeHTMLAttributes, setHTMLAttributes } from '@progress/kendo-angular-common';
9
9
  import { SplitterService } from './splitter.service';
10
10
  import { Subscription, of } from 'rxjs';
11
11
  import { delay, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';
@@ -225,7 +225,7 @@ export class SplitterBarComponent {
225
225
  return panes.length === 2 && panes[1].collapsed;
226
226
  }
227
227
  onKeyDown(event) {
228
- const keyCode = normalizeNumpadKeys(event);
228
+ const keyCode = normalizeKeys(event);
229
229
  const shouldToggle = event.ctrlKey || event.metaKey;
230
230
  if (keyCode === Keys.Enter || keyCode === Keys.NumpadEnter) {
231
231
  event.preventDefault();
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable, NgZone, ChangeDetectorRef, EventEmitter } from '@angular/core';
6
- import { hasObservers, Keys, normalizeNumpadKeys, PreventableEvent } from '@progress/kendo-angular-common';
6
+ import { hasObservers, Keys, normalizeKeys, PreventableEvent } from '@progress/kendo-angular-common';
7
7
  import { LocalizationService } from '@progress/kendo-angular-l10n';
8
8
  import { isPresent } from '../common/util';
9
9
  import * as i0 from "@angular/core";
@@ -100,7 +100,7 @@ export class StepperService {
100
100
  keydown(e) {
101
101
  const current = this.focusedStep || this.currentStep;
102
102
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
103
- const code = normalizeNumpadKeys(e);
103
+ const code = normalizeKeys(e);
104
104
  const handler = this.handlers[code];
105
105
  if (!isPresent(current)) {
106
106
  return;
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable, NgZone } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { isArrowKey, isHorizontalArrowKey, isNavigationKey, isVerticalArrowKey } from '../common/util';
9
9
  import { SelectEvent } from './events';
10
10
  import { isTabClosable, getActiveTab, isTabElement, isTablistHorizontal, getTabByIndex, getTabHeaderByIndex, resetTabSelection } from './util';
@@ -26,7 +26,7 @@ export class TabStripService {
26
26
  return;
27
27
  }
28
28
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
29
- const code = normalizeNumpadKeys(event);
29
+ const code = normalizeKeys(event);
30
30
  if (this.shouldHandleKey(code)) {
31
31
  event.preventDefault();
32
32
  }
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  /* eslint-disable no-unused-expressions */
6
6
  import { Injectable, NgZone, Renderer2 } from '@angular/core';
7
- import { Keys, normalizeNumpadKeys } from '@progress/kendo-angular-common';
7
+ import { Keys, normalizeKeys } from '@progress/kendo-angular-common';
8
8
  import { LocalizationService } from '@progress/kendo-angular-l10n';
9
9
  import { BehaviorSubject } from 'rxjs';
10
10
  import { focusableSelector } from '@progress/kendo-angular-common';
@@ -36,7 +36,7 @@ export class TileLayoutKeyboardNavigationService {
36
36
  this.localizationSubscription.unsubscribe();
37
37
  }
38
38
  onKeyDown(event, elem, focusableItems, settings) {
39
- const keyCode = normalizeNumpadKeys(event);
39
+ const keyCode = normalizeKeys(event);
40
40
  const isTileFocused = document.activeElement === elem;
41
41
  const focusedTile = settings.items.find(item => item.elem.nativeElement === elem);
42
42
  const col = getCurrentCol(focusedTile, settings, this.rtl);
@@ -6,7 +6,7 @@ import { ChangeDetectorRef, Component, ElementRef, Input, NgZone, QueryList, Ren
6
6
  import { caretAltLeftIcon, caretAltRightIcon } from '@progress/kendo-svg-icons';
7
7
  import { Subscription } from 'rxjs';
8
8
  import { TimelineCardComponent } from './timeline-card.component';
9
- import { Keys, ResizeSensorComponent, guid, isChanged, isDocumentAvailable, isPresent, normalizeNumpadKeys } from '@progress/kendo-angular-common';
9
+ import { Keys, ResizeSensorComponent, guid, isChanged, isDocumentAvailable, isPresent, normalizeKeys } from '@progress/kendo-angular-common';
10
10
  import { animate, state, style, transition, trigger } from '@angular/animations';
11
11
  import { TimelineService } from './timeline.service';
12
12
  import { LocalizationService } from '@progress/kendo-angular-l10n';
@@ -300,7 +300,7 @@ export class TimelineHorizontalComponent {
300
300
  if (!this.navigable) {
301
301
  return;
302
302
  }
303
- const code = normalizeNumpadKeys(event);
303
+ const code = normalizeKeys(event);
304
304
  event.preventDefault();
305
305
  if (code === Keys.Home) {
306
306
  this.onHomeKey();
@@ -39,19 +39,7 @@ export class TimelineComponent {
39
39
  }
40
40
  this.originalData = events;
41
41
  this._events = processItems(this.originalData, this.modelFields);
42
- this._events.sort((a, b) => {
43
- const order = this.eventsOrder === 'asc' ? 1 : -1;
44
- return order * (a.date.getTime() - b.date.getTime());
45
- });
46
- if (this._events.length > 0) {
47
- let flag = this._events[0].date.getFullYear() - 1;
48
- this._events.forEach((event) => {
49
- if (event.date.getFullYear() !== flag) {
50
- flag = event.date.getFullYear();
51
- event.flag = flag;
52
- }
53
- });
54
- }
42
+ this.updateEvents();
55
43
  }
56
44
  get events() {
57
45
  return this._events;
@@ -118,10 +106,7 @@ export class TimelineComponent {
118
106
  return;
119
107
  }
120
108
  this._eventsOrder = order;
121
- this._events = [...this._events].sort((a, b) => {
122
- const sortOrder = order === 'asc' ? 1 : -1;
123
- return sortOrder * (a.date.getTime() - b.date.getTime());
124
- });
109
+ this.updateEvents();
125
110
  }
126
111
  get eventsOrder() {
127
112
  return this._eventsOrder;
@@ -300,6 +285,24 @@ export class TimelineComponent {
300
285
  collapse(index) {
301
286
  this.timelineVertical?.collapse(index);
302
287
  }
288
+ updateEvents() {
289
+ const sortOrder = this._eventsOrder === 'asc' ? 1 : -1;
290
+ this._events = [...this._events].sort((a, b) => {
291
+ return sortOrder * (a.date.getTime() - b.date.getTime());
292
+ });
293
+ if (this._events.length > 0) {
294
+ let flag = this._events[0].date.getFullYear() - sortOrder;
295
+ this._events.forEach((event) => {
296
+ if (event.date.getFullYear() === flag) {
297
+ event.flag = null;
298
+ }
299
+ else {
300
+ flag = event.date.getFullYear();
301
+ event.flag = flag;
302
+ }
303
+ });
304
+ }
305
+ }
303
306
  initTemplates() {
304
307
  this.headerTemplate = this.cardHeaderTemplate?.first;
305
308
  this.bodyTemplate = this.cardBodyTemplate?.first;
@@ -7,7 +7,7 @@ import { Injectable, Directive, Optional, isDevMode, Component, SkipSelf, Host,
7
7
  import * as i1 from '@progress/kendo-angular-l10n';
8
8
  import { LocalizationService, L10N_PREFIX, ComponentMessages } from '@progress/kendo-angular-l10n';
9
9
  import * as i1$1 from '@progress/kendo-angular-common';
10
- import { Keys, getLicenseMessage, shouldShowValidationUI, normalizeNumpadKeys, WatermarkOverlayComponent, isDocumentAvailable, anyChanged, isObjectPresent, removeHTMLAttributes, parseAttributes, setHTMLAttributes, DraggableDirective, PreventableEvent as PreventableEvent$1, guid, ResizeSensorComponent, hasObservers, isPresent as isPresent$1, focusableSelector, isChanged } from '@progress/kendo-angular-common';
10
+ import { Keys, getLicenseMessage, shouldShowValidationUI, normalizeKeys, WatermarkOverlayComponent, isDocumentAvailable, anyChanged, isObjectPresent, removeHTMLAttributes, parseAttributes, setHTMLAttributes, DraggableDirective, PreventableEvent as PreventableEvent$1, guid, ResizeSensorComponent, hasObservers, isPresent as isPresent$1, focusableSelector, isChanged } from '@progress/kendo-angular-common';
11
11
  import { validatePackage } from '@progress/kendo-licensing';
12
12
  import * as i1$2 from '@angular/animations';
13
13
  import { trigger, state, style, transition, animate, AUTO_STYLE } from '@angular/animations';
@@ -29,8 +29,8 @@ const packageMetadata = {
29
29
  productName: 'Kendo UI for Angular',
30
30
  productCode: 'KENDOUIANGULAR',
31
31
  productCodes: ['KENDOUIANGULAR'],
32
- publishDate: 1764346534,
33
- version: '21.2.0-develop.9',
32
+ publishDate: 1764778665,
33
+ version: '21.3.0-develop.1',
34
34
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
35
35
  };
36
36
 
@@ -1363,7 +1363,7 @@ class PanelBarComponent {
1363
1363
  onComponentKeyDown(event) {
1364
1364
  if (event.target === this.elementRef.nativeElement) {
1365
1365
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
1366
- const code = normalizeNumpadKeys(event);
1366
+ const code = normalizeKeys(event);
1367
1367
  if (code === Keys.Space || code === Keys.ArrowUp || code === Keys.ArrowDown ||
1368
1368
  code === Keys.ArrowLeft || code === Keys.ArrowRight || code === Keys.Home ||
1369
1369
  code === Keys.End || code === Keys.PageUp || code === Keys.PageDown) {
@@ -2546,7 +2546,7 @@ class SplitterBarComponent {
2546
2546
  return panes.length === 2 && panes[1].collapsed;
2547
2547
  }
2548
2548
  onKeyDown(event) {
2549
- const keyCode = normalizeNumpadKeys(event);
2549
+ const keyCode = normalizeKeys(event);
2550
2550
  const shouldToggle = event.ctrlKey || event.metaKey;
2551
2551
  if (keyCode === Keys.Enter || keyCode === Keys.NumpadEnter) {
2552
2552
  event.preventDefault();
@@ -3340,7 +3340,7 @@ class TabStripService {
3340
3340
  return;
3341
3341
  }
3342
3342
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
3343
- const code = normalizeNumpadKeys(event);
3343
+ const code = normalizeKeys(event);
3344
3344
  if (this.shouldHandleKey(code)) {
3345
3345
  event.preventDefault();
3346
3346
  }
@@ -5703,7 +5703,7 @@ class DrawerListComponent {
5703
5703
  const nativeElement = this.element.nativeElement;
5704
5704
  this.subscriptions.add(this.renderer.listen(nativeElement, 'click', this.clickHandler.bind(this)));
5705
5705
  this.subscriptions.add(this.renderer.listen(nativeElement, 'keydown', (e) => {
5706
- const code = normalizeNumpadKeys(e);
5706
+ const code = normalizeKeys(e);
5707
5707
  const isEnterOrSpace = code === Keys.Enter || code === Keys.Space;
5708
5708
  const isArrowUpOrDown = code === Keys.ArrowUp || code === Keys.ArrowDown;
5709
5709
  if (isEnterOrSpace) {
@@ -6645,7 +6645,7 @@ class StepperService {
6645
6645
  keydown(e) {
6646
6646
  const current = this.focusedStep || this.currentStep;
6647
6647
  // on some keyboards arrow keys, PageUp/Down, and Home/End are mapped to Numpad keys
6648
- const code = normalizeNumpadKeys(e);
6648
+ const code = normalizeKeys(e);
6649
6649
  const handler = this.handlers[code];
6650
6650
  if (!isPresent(current)) {
6651
6651
  return;
@@ -10110,7 +10110,7 @@ class TileLayoutKeyboardNavigationService {
10110
10110
  this.localizationSubscription.unsubscribe();
10111
10111
  }
10112
10112
  onKeyDown(event, elem, focusableItems, settings) {
10113
- const keyCode = normalizeNumpadKeys(event);
10113
+ const keyCode = normalizeKeys(event);
10114
10114
  const isTileFocused = document.activeElement === elem;
10115
10115
  const focusedTile = settings.items.find(item => item.elem.nativeElement === elem);
10116
10116
  const col = getCurrentCol(focusedTile, settings, this.rtl);
@@ -12502,7 +12502,7 @@ class TimelineHorizontalComponent {
12502
12502
  if (!this.navigable) {
12503
12503
  return;
12504
12504
  }
12505
- const code = normalizeNumpadKeys(event);
12505
+ const code = normalizeKeys(event);
12506
12506
  event.preventDefault();
12507
12507
  if (code === Keys.Home) {
12508
12508
  this.onHomeKey();
@@ -13225,19 +13225,7 @@ class TimelineComponent {
13225
13225
  }
13226
13226
  this.originalData = events;
13227
13227
  this._events = processItems(this.originalData, this.modelFields);
13228
- this._events.sort((a, b) => {
13229
- const order = this.eventsOrder === 'asc' ? 1 : -1;
13230
- return order * (a.date.getTime() - b.date.getTime());
13231
- });
13232
- if (this._events.length > 0) {
13233
- let flag = this._events[0].date.getFullYear() - 1;
13234
- this._events.forEach((event) => {
13235
- if (event.date.getFullYear() !== flag) {
13236
- flag = event.date.getFullYear();
13237
- event.flag = flag;
13238
- }
13239
- });
13240
- }
13228
+ this.updateEvents();
13241
13229
  }
13242
13230
  get events() {
13243
13231
  return this._events;
@@ -13304,10 +13292,7 @@ class TimelineComponent {
13304
13292
  return;
13305
13293
  }
13306
13294
  this._eventsOrder = order;
13307
- this._events = [...this._events].sort((a, b) => {
13308
- const sortOrder = order === 'asc' ? 1 : -1;
13309
- return sortOrder * (a.date.getTime() - b.date.getTime());
13310
- });
13295
+ this.updateEvents();
13311
13296
  }
13312
13297
  get eventsOrder() {
13313
13298
  return this._eventsOrder;
@@ -13486,6 +13471,24 @@ class TimelineComponent {
13486
13471
  collapse(index) {
13487
13472
  this.timelineVertical?.collapse(index);
13488
13473
  }
13474
+ updateEvents() {
13475
+ const sortOrder = this._eventsOrder === 'asc' ? 1 : -1;
13476
+ this._events = [...this._events].sort((a, b) => {
13477
+ return sortOrder * (a.date.getTime() - b.date.getTime());
13478
+ });
13479
+ if (this._events.length > 0) {
13480
+ let flag = this._events[0].date.getFullYear() - sortOrder;
13481
+ this._events.forEach((event) => {
13482
+ if (event.date.getFullYear() === flag) {
13483
+ event.flag = null;
13484
+ }
13485
+ else {
13486
+ flag = event.date.getFullYear();
13487
+ event.flag = flag;
13488
+ }
13489
+ });
13490
+ }
13491
+ }
13489
13492
  initTemplates() {
13490
13493
  this.headerTemplate = this.cardHeaderTemplate?.first;
13491
13494
  this.bodyTemplate = this.cardBodyTemplate?.first;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-layout",
3
- "version": "21.2.0-develop.9",
3
+ "version": "21.3.0-develop.1",
4
4
  "description": "Kendo UI for Angular Layout Package - a collection of components to create professional application layoyts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -50,7 +50,7 @@
50
50
  "package": {
51
51
  "productName": "Kendo UI for Angular",
52
52
  "productCode": "KENDOUIANGULAR",
53
- "publishDate": 1764346534,
53
+ "publishDate": 1764778665,
54
54
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning"
55
55
  }
56
56
  },
@@ -60,17 +60,17 @@
60
60
  "@angular/core": "18 - 21",
61
61
  "@angular/platform-browser": "18 - 21",
62
62
  "@progress/kendo-licensing": "^1.7.0",
63
- "@progress/kendo-angular-common": "21.2.0-develop.9",
64
- "@progress/kendo-angular-l10n": "21.2.0-develop.9",
65
- "@progress/kendo-angular-progressbar": "21.2.0-develop.9",
66
- "@progress/kendo-angular-icons": "21.2.0-develop.9",
67
- "@progress/kendo-angular-buttons": "21.2.0-develop.9",
68
- "@progress/kendo-angular-intl": "21.2.0-develop.9",
63
+ "@progress/kendo-angular-common": "21.3.0-develop.1",
64
+ "@progress/kendo-angular-l10n": "21.3.0-develop.1",
65
+ "@progress/kendo-angular-progressbar": "21.3.0-develop.1",
66
+ "@progress/kendo-angular-icons": "21.3.0-develop.1",
67
+ "@progress/kendo-angular-buttons": "21.3.0-develop.1",
68
+ "@progress/kendo-angular-intl": "21.3.0-develop.1",
69
69
  "rxjs": "^6.5.3 || ^7.0.0"
70
70
  },
71
71
  "dependencies": {
72
72
  "tslib": "^2.3.1",
73
- "@progress/kendo-angular-schematics": "21.2.0-develop.9",
73
+ "@progress/kendo-angular-schematics": "21.3.0-develop.1",
74
74
  "@progress/kendo-draggable": "^3.0.2"
75
75
  },
76
76
  "schematics": "./schematics/collection.json",
@@ -193,6 +193,7 @@ export declare class TimelineComponent implements AfterContentInit, OnDestroy {
193
193
  * This method is supported only in `vertical` mode.
194
194
  */
195
195
  collapse(index: number): void;
196
+ private updateEvents;
196
197
  private initTemplates;
197
198
  static ɵfac: i0.ɵɵFactoryDeclaration<TimelineComponent, never>;
198
199
  static ɵcmp: i0.ɵɵComponentDeclaration<TimelineComponent, "kendo-timeline", ["kendoTimeline"], { "events": { "alias": "events"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; "orientation": { "alias": "orientation"; "required": false; }; "alterMode": { "alias": "alterMode"; "required": false; }; "collapsibleEvents": { "alias": "collapsibleEvents"; "required": false; }; "navigable": { "alias": "navigable"; "required": false; }; "showDateLabels": { "alias": "showDateLabels"; "required": false; }; "animation": { "alias": "animation"; "required": false; }; "eventsOrder": { "alias": "eventsOrder"; "required": false; }; "eventWidth": { "alias": "eventWidth"; "required": false; }; "eventHeight": { "alias": "eventHeight"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; }, { "onToggle": "onToggle"; "onActionClick": "onActionClick"; "onNavigate": "onNavigate"; }, ["cardHeaderTemplate", "cardBodyTemplate", "cardActionsTemplate"], never, true, never>;