@progress/kendo-angular-common 19.3.0-develop.8 → 19.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/enums/keys.d.ts CHANGED
@@ -6,62 +6,69 @@
6
6
  * Enum with key codes.
7
7
  */
8
8
  export declare enum Keys {
9
- Alt = 18,
10
- ArrowDown = 40,
11
- ArrowLeft = 37,
12
- ArrowRight = 39,
13
- ArrowUp = 38,
14
- Backspace = 8,
15
- Control = 17,
16
- Delete = 46,
17
- Digit0 = 48,
18
- Digit1 = 49,
19
- Digit2 = 50,
20
- Digit3 = 51,
21
- Digit4 = 52,
22
- Digit5 = 53,
23
- Digit6 = 54,
24
- Digit7 = 55,
25
- Digit8 = 56,
26
- Digit9 = 57,
27
- End = 35,
28
- Enter = 13,
29
- Escape = 27,
30
- F1 = 112,
31
- F2 = 113,
32
- F10 = 121,
33
- Home = 36,
34
- Insert = 45,
35
- KeyA = 65,
36
- KeyB = 66,
37
- KeyC = 67,
38
- KeyD = 68,
39
- KeyE = 69,
40
- KeyF = 70,
41
- KeyG = 71,
42
- KeyH = 72,
43
- KeyI = 73,
44
- KeyJ = 74,
45
- KeyK = 75,
46
- KeyL = 76,
47
- KeyM = 77,
48
- KeyN = 78,
49
- KeyO = 79,
50
- KeyP = 80,
51
- KeyQ = 81,
52
- KeyR = 82,
53
- KeyS = 83,
54
- KeyT = 84,
55
- KeyU = 85,
56
- KeyV = 86,
57
- KeyW = 87,
58
- KeyX = 88,
59
- KeyY = 89,
60
- KeyZ = 90,
61
- NumpadDecimal = 110,
62
- PageDown = 34,
63
- PageUp = 33,
64
- Shift = 16,
65
- Space = 32,
66
- Tab = 9
9
+ ArrowDown = "ArrowDown",
10
+ ArrowLeft = "ArrowLeft",
11
+ ArrowRight = "ArrowRight",
12
+ ArrowUp = "ArrowUp",
13
+ Backspace = "Backspace",
14
+ Delete = "Delete",
15
+ Digit0 = "Digit0",
16
+ Digit1 = "Digit1",
17
+ Digit2 = "Digit2",
18
+ Digit3 = "Digit3",
19
+ Digit4 = "Digit4",
20
+ Digit5 = "Digit5",
21
+ Digit6 = "Digit6",
22
+ Digit7 = "Digit7",
23
+ Digit8 = "Digit8",
24
+ Digit9 = "Digit9",
25
+ End = "End",
26
+ Enter = "Enter",
27
+ Escape = "Escape",
28
+ F1 = "F1",
29
+ F2 = "F2",
30
+ F10 = "F10",
31
+ Home = "Home",
32
+ KeyA = "KeyA",
33
+ KeyB = "KeyB",
34
+ KeyC = "KeyC",
35
+ KeyD = "KeyD",
36
+ KeyE = "KeyE",
37
+ KeyF = "KeyF",
38
+ KeyG = "KeyG",
39
+ KeyH = "KeyH",
40
+ KeyI = "KeyI",
41
+ KeyJ = "KeyJ",
42
+ KeyK = "KeyK",
43
+ KeyL = "KeyL",
44
+ KeyM = "KeyM",
45
+ KeyN = "KeyN",
46
+ KeyO = "KeyO",
47
+ KeyP = "KeyP",
48
+ KeyQ = "KeyQ",
49
+ KeyR = "KeyR",
50
+ KeyS = "KeyS",
51
+ KeyT = "KeyT",
52
+ KeyU = "KeyU",
53
+ KeyV = "KeyV",
54
+ KeyW = "KeyW",
55
+ KeyX = "KeyX",
56
+ KeyY = "KeyY",
57
+ KeyZ = "KeyZ",
58
+ Numpad1 = "Numpad1",
59
+ Numpad2 = "Numpad2",
60
+ Numpad3 = "Numpad3",
61
+ Numpad4 = "Numpad4",
62
+ Numpad5 = "Numpad5",
63
+ Numpad6 = "Numpad6",
64
+ Numpad7 = "Numpad7",
65
+ Numpad8 = "Numpad8",
66
+ Numpad9 = "Numpad9",
67
+ Numpad0 = "Numpad0",
68
+ NumpadEnter = "NumpadEnter",
69
+ NumpadDecimal = "NumpadDecimal",
70
+ PageDown = "PageDown",
71
+ PageUp = "PageUp",
72
+ Space = "Space",
73
+ Tab = "Tab"
67
74
  }
@@ -7,62 +7,69 @@
7
7
  */
8
8
  export var Keys;
9
9
  (function (Keys) {
10
- Keys[Keys["Alt"] = 18] = "Alt";
11
- Keys[Keys["ArrowDown"] = 40] = "ArrowDown";
12
- Keys[Keys["ArrowLeft"] = 37] = "ArrowLeft";
13
- Keys[Keys["ArrowRight"] = 39] = "ArrowRight";
14
- Keys[Keys["ArrowUp"] = 38] = "ArrowUp";
15
- Keys[Keys["Backspace"] = 8] = "Backspace";
16
- Keys[Keys["Control"] = 17] = "Control";
17
- Keys[Keys["Delete"] = 46] = "Delete";
18
- Keys[Keys["Digit0"] = 48] = "Digit0";
19
- Keys[Keys["Digit1"] = 49] = "Digit1";
20
- Keys[Keys["Digit2"] = 50] = "Digit2";
21
- Keys[Keys["Digit3"] = 51] = "Digit3";
22
- Keys[Keys["Digit4"] = 52] = "Digit4";
23
- Keys[Keys["Digit5"] = 53] = "Digit5";
24
- Keys[Keys["Digit6"] = 54] = "Digit6";
25
- Keys[Keys["Digit7"] = 55] = "Digit7";
26
- Keys[Keys["Digit8"] = 56] = "Digit8";
27
- Keys[Keys["Digit9"] = 57] = "Digit9";
28
- Keys[Keys["End"] = 35] = "End";
29
- Keys[Keys["Enter"] = 13] = "Enter";
30
- Keys[Keys["Escape"] = 27] = "Escape";
31
- Keys[Keys["F1"] = 112] = "F1";
32
- Keys[Keys["F2"] = 113] = "F2";
33
- Keys[Keys["F10"] = 121] = "F10";
34
- Keys[Keys["Home"] = 36] = "Home";
35
- Keys[Keys["Insert"] = 45] = "Insert";
36
- Keys[Keys["KeyA"] = 65] = "KeyA";
37
- Keys[Keys["KeyB"] = 66] = "KeyB";
38
- Keys[Keys["KeyC"] = 67] = "KeyC";
39
- Keys[Keys["KeyD"] = 68] = "KeyD";
40
- Keys[Keys["KeyE"] = 69] = "KeyE";
41
- Keys[Keys["KeyF"] = 70] = "KeyF";
42
- Keys[Keys["KeyG"] = 71] = "KeyG";
43
- Keys[Keys["KeyH"] = 72] = "KeyH";
44
- Keys[Keys["KeyI"] = 73] = "KeyI";
45
- Keys[Keys["KeyJ"] = 74] = "KeyJ";
46
- Keys[Keys["KeyK"] = 75] = "KeyK";
47
- Keys[Keys["KeyL"] = 76] = "KeyL";
48
- Keys[Keys["KeyM"] = 77] = "KeyM";
49
- Keys[Keys["KeyN"] = 78] = "KeyN";
50
- Keys[Keys["KeyO"] = 79] = "KeyO";
51
- Keys[Keys["KeyP"] = 80] = "KeyP";
52
- Keys[Keys["KeyQ"] = 81] = "KeyQ";
53
- Keys[Keys["KeyR"] = 82] = "KeyR";
54
- Keys[Keys["KeyS"] = 83] = "KeyS";
55
- Keys[Keys["KeyT"] = 84] = "KeyT";
56
- Keys[Keys["KeyU"] = 85] = "KeyU";
57
- Keys[Keys["KeyV"] = 86] = "KeyV";
58
- Keys[Keys["KeyW"] = 87] = "KeyW";
59
- Keys[Keys["KeyX"] = 88] = "KeyX";
60
- Keys[Keys["KeyY"] = 89] = "KeyY";
61
- Keys[Keys["KeyZ"] = 90] = "KeyZ";
62
- Keys[Keys["NumpadDecimal"] = 110] = "NumpadDecimal";
63
- Keys[Keys["PageDown"] = 34] = "PageDown";
64
- Keys[Keys["PageUp"] = 33] = "PageUp";
65
- Keys[Keys["Shift"] = 16] = "Shift";
66
- Keys[Keys["Space"] = 32] = "Space";
67
- Keys[Keys["Tab"] = 9] = "Tab";
10
+ Keys["ArrowDown"] = "ArrowDown";
11
+ Keys["ArrowLeft"] = "ArrowLeft";
12
+ Keys["ArrowRight"] = "ArrowRight";
13
+ Keys["ArrowUp"] = "ArrowUp";
14
+ Keys["Backspace"] = "Backspace";
15
+ Keys["Delete"] = "Delete";
16
+ Keys["Digit0"] = "Digit0";
17
+ Keys["Digit1"] = "Digit1";
18
+ Keys["Digit2"] = "Digit2";
19
+ Keys["Digit3"] = "Digit3";
20
+ Keys["Digit4"] = "Digit4";
21
+ Keys["Digit5"] = "Digit5";
22
+ Keys["Digit6"] = "Digit6";
23
+ Keys["Digit7"] = "Digit7";
24
+ Keys["Digit8"] = "Digit8";
25
+ Keys["Digit9"] = "Digit9";
26
+ Keys["End"] = "End";
27
+ Keys["Enter"] = "Enter";
28
+ Keys["Escape"] = "Escape";
29
+ Keys["F1"] = "F1";
30
+ Keys["F2"] = "F2";
31
+ Keys["F10"] = "F10";
32
+ Keys["Home"] = "Home";
33
+ Keys["KeyA"] = "KeyA";
34
+ Keys["KeyB"] = "KeyB";
35
+ Keys["KeyC"] = "KeyC";
36
+ Keys["KeyD"] = "KeyD";
37
+ Keys["KeyE"] = "KeyE";
38
+ Keys["KeyF"] = "KeyF";
39
+ Keys["KeyG"] = "KeyG";
40
+ Keys["KeyH"] = "KeyH";
41
+ Keys["KeyI"] = "KeyI";
42
+ Keys["KeyJ"] = "KeyJ";
43
+ Keys["KeyK"] = "KeyK";
44
+ Keys["KeyL"] = "KeyL";
45
+ Keys["KeyM"] = "KeyM";
46
+ Keys["KeyN"] = "KeyN";
47
+ Keys["KeyO"] = "KeyO";
48
+ Keys["KeyP"] = "KeyP";
49
+ Keys["KeyQ"] = "KeyQ";
50
+ Keys["KeyR"] = "KeyR";
51
+ Keys["KeyS"] = "KeyS";
52
+ Keys["KeyT"] = "KeyT";
53
+ Keys["KeyU"] = "KeyU";
54
+ Keys["KeyV"] = "KeyV";
55
+ Keys["KeyW"] = "KeyW";
56
+ Keys["KeyX"] = "KeyX";
57
+ Keys["KeyY"] = "KeyY";
58
+ Keys["KeyZ"] = "KeyZ";
59
+ Keys["Numpad1"] = "Numpad1";
60
+ Keys["Numpad2"] = "Numpad2";
61
+ Keys["Numpad3"] = "Numpad3";
62
+ Keys["Numpad4"] = "Numpad4";
63
+ Keys["Numpad5"] = "Numpad5";
64
+ Keys["Numpad6"] = "Numpad6";
65
+ Keys["Numpad7"] = "Numpad7";
66
+ Keys["Numpad8"] = "Numpad8";
67
+ Keys["Numpad9"] = "Numpad9";
68
+ Keys["Numpad0"] = "Numpad0";
69
+ Keys["NumpadEnter"] = "NumpadEnter";
70
+ Keys["NumpadDecimal"] = "NumpadDecimal";
71
+ Keys["PageDown"] = "PageDown";
72
+ Keys["PageUp"] = "PageUp";
73
+ Keys["Space"] = "Space";
74
+ Keys["Tab"] = "Tab";
68
75
  })(Keys || (Keys = {}));
package/esm2022/index.mjs CHANGED
@@ -11,6 +11,7 @@ export * from './utils';
11
11
  export * from './enums';
12
12
  export * from './utils/focusable-selectors';
13
13
  export * from './utils/ng-class-parser';
14
+ export * from './utils/numpad-keys-normalizer';
14
15
  export * from './watermark';
15
16
  export * from './adornments';
16
17
  export { PreventableEvent } from './preventable-event';
@@ -8,6 +8,7 @@ import { MultiTabStop } from "./toggle-button-tab-stop";
8
8
  import { Subscription } from "rxjs";
9
9
  import { take } from "rxjs/operators";
10
10
  import { Keys } from "../enums";
11
+ import { normalizeNumpadKeys } from "../utils/numpad-keys-normalizer";
11
12
  import * as i0 from "@angular/core";
12
13
  import * as i1 from "./toggle-button-tab-stop";
13
14
  const tags = ['kendo-splitbutton', 'kendo-combobox', 'kendo-multicolumncombobox', 'kendo-datepicker', 'kendo-timepicker', 'kendo-datetimepicker'];
@@ -144,12 +145,14 @@ export class ToggleButtonTabStopDirective {
144
145
  this.renderer.removeStyle(this.button, 'box-shadow');
145
146
  };
146
147
  onClick = (e) => {
147
- const splitButtonToggleEnter = e instanceof KeyboardEvent && e.keyCode === Keys.Enter;
148
+ const code = normalizeNumpadKeys(e);
149
+ const splitButtonToggleEnter = e instanceof KeyboardEvent && code === Keys.Enter;
148
150
  const isClick = e instanceof PointerEvent;
149
151
  (splitButtonToggleEnter || isClick) && (this.focusButton = true);
150
152
  };
151
153
  onKeyDown = (e) => {
152
- if (e.keyCode === Keys.ArrowDown && e.altKey) {
154
+ const code = normalizeNumpadKeys(e);
155
+ if (code === Keys.ArrowDown && e.altKey) {
153
156
  e.stopImmediatePropagation();
154
157
  this.focusButton = true;
155
158
  this.button.click();
@@ -0,0 +1,40 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { Keys } from "../enums";
6
+ /**
7
+ * @hidden
8
+ *
9
+ * On some keyboards, PageUp/Down, Home/End, and arrow keys are mapped to Numpad keys
10
+ */
11
+ export const normalizeNumpadKeys = (event) => {
12
+ if (event.code === Keys.Numpad1 && event.key === Keys.End) {
13
+ return Keys.End;
14
+ }
15
+ if (event.code === Keys.Numpad2 && event.key === Keys.ArrowDown) {
16
+ return Keys.ArrowDown;
17
+ }
18
+ if (event.code === Keys.Numpad3 && event.key === Keys.PageDown) {
19
+ return Keys.PageDown;
20
+ }
21
+ if (event.code === Keys.Numpad4 && event.key === Keys.ArrowLeft) {
22
+ return Keys.ArrowLeft;
23
+ }
24
+ if (event.code === Keys.Numpad6 && event.key === Keys.ArrowRight) {
25
+ return Keys.ArrowRight;
26
+ }
27
+ if (event.code === Keys.Numpad7 && event.key === Keys.Home) {
28
+ return Keys.Home;
29
+ }
30
+ if (event.code === Keys.Numpad8 && event.key === Keys.ArrowUp) {
31
+ return Keys.ArrowUp;
32
+ }
33
+ if (event.code === Keys.Numpad9 && event.key === Keys.PageUp) {
34
+ return Keys.PageUp;
35
+ }
36
+ if (event.code === Keys.NumpadEnter) {
37
+ return Keys.Enter;
38
+ }
39
+ return event.code;
40
+ };
@@ -0,0 +1,23 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ export const processCssValue = (value) => {
6
+ if (typeof value === 'number') {
7
+ return `${value}px`;
8
+ }
9
+ else if (typeof value === 'string') {
10
+ const trimmedValue = value.trim();
11
+ const numValue = parseInt(trimmedValue, 10);
12
+ if (!isNaN(numValue) && Number.isFinite(numValue)) {
13
+ if (numValue.toString() === trimmedValue) {
14
+ return `${numValue}px`;
15
+ }
16
+ else {
17
+ return value;
18
+ }
19
+ }
20
+ return null;
21
+ }
22
+ return null;
23
+ };
package/esm2022/utils.mjs CHANGED
@@ -11,3 +11,4 @@ export { isSafari, isFirefox } from './utils/detect-browser';
11
11
  export * from './utils/html-attributes';
12
12
  export { isControlRequired } from './utils/forms-utils';
13
13
  export { areObjectsEqual } from './utils/objects-equal';
14
+ export { processCssValue } from './utils/process-css-value';
@@ -3,4 +3,4 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  export { WatermarkOverlayComponent } from './watermark.component';
6
- export { shouldShowValidationUI } from './validation';
6
+ export { shouldShowValidationUI, getLicenseMessage } from './validation';
@@ -2,6 +2,7 @@
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 { getLicenseStatus } from "@progress/kendo-licensing";
5
6
  const allowed = ['telerik.com', 'progress.com', 'stackblitz.io', 'csb.app'];
6
7
  /**
7
8
  * @hidden
@@ -10,3 +11,12 @@ export function shouldShowValidationUI(isPackageValid) {
10
11
  const skip = allowed.some((hostname) => globalThis.document?.location.hostname.endsWith(hostname));
11
12
  return !skip && !isPackageValid;
12
13
  }
14
+ /**
15
+ * @hidden
16
+ *
17
+ * Returns the notification message to display, if any.
18
+ */
19
+ export function getLicenseMessage(meta) {
20
+ const message = getLicenseStatus(meta).message;
21
+ return message?.notificationMessage;
22
+ }
@@ -2,7 +2,7 @@
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 { Component, ElementRef, HostBinding, ViewChild } from '@angular/core';
5
+ import { Component, ElementRef, HostBinding, Input, ViewChild } from '@angular/core';
6
6
  import { watermarkStyles, bannerStyles, licenseKeyUrl, buttonStyles } from './utils';
7
7
  import { isDocumentAvailable } from '../utils';
8
8
  import { NgIf, NgStyle } from '@angular/common';
@@ -13,6 +13,7 @@ let bannerPresentOnPage = false;
13
13
  */
14
14
  export class WatermarkOverlayComponent {
15
15
  watermarkStyle = watermarkStyles;
16
+ licenseMessage;
16
17
  banner;
17
18
  isOpen = true;
18
19
  bannerMounted = false;
@@ -42,7 +43,7 @@ export class WatermarkOverlayComponent {
42
43
  return isDocumentAvailable() && this.banner && this.banner.nativeElement;
43
44
  }
44
45
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WatermarkOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
45
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: WatermarkOverlayComponent, isStandalone: true, selector: "div[kendoWatermarkOverlay]", host: { properties: { "style": "this.watermarkStyle" } }, viewQueries: [{ propertyName: "banner", first: true, predicate: ["banner"], descendants: true }], ngImport: i0, template: `
46
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: WatermarkOverlayComponent, isStandalone: true, selector: "div[kendoWatermarkOverlay]", inputs: { licenseMessage: "licenseMessage" }, host: { properties: { "style": "this.watermarkStyle" } }, viewQueries: [{ propertyName: "banner", first: true, predicate: ["banner"], descendants: true }], ngImport: i0, template: `
46
47
  <div #banner *ngIf="isOpen && bannerMounted" [ngStyle]="bannerStyles">
47
48
  <span [ngStyle]="{ display: 'flex', alignSelf: 'center', marginRight: '8px' }">
48
49
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
@@ -50,7 +51,8 @@ export class WatermarkOverlayComponent {
50
51
  </svg>
51
52
  </span>
52
53
 
53
- <span>
54
+ <span *ngIf="licenseMessage" [innerHtml]="licenseMessage"></span>
55
+ <span *ngIf="!licenseMessage">
54
56
  We couldn't verify your <a [href]="licenseKeyUrl">license key</a> for Kendo UI for Angular. Please see the browser
55
57
  console for details and resolution steps.
56
58
  </span>
@@ -77,7 +79,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
77
79
  </svg>
78
80
  </span>
79
81
 
80
- <span>
82
+ <span *ngIf="licenseMessage" [innerHtml]="licenseMessage"></span>
83
+ <span *ngIf="!licenseMessage">
81
84
  We couldn't verify your <a [href]="licenseKeyUrl">license key</a> for Kendo UI for Angular. Please see the browser
82
85
  console for details and resolution steps.
83
86
  </span>
@@ -97,6 +100,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
97
100
  }], propDecorators: { watermarkStyle: [{
98
101
  type: HostBinding,
99
102
  args: ['style']
103
+ }], licenseMessage: [{
104
+ type: Input
100
105
  }], banner: [{
101
106
  type: ViewChild,
102
107
  args: ['banner']
@@ -9,6 +9,7 @@ import { take, auditTime } from 'rxjs/operators';
9
9
  import { Draggable } from '@progress/kendo-draggable';
10
10
  import { merge, fromEvent, from, Subscription } from 'rxjs';
11
11
  import { NgIf, NgStyle } from '@angular/common';
12
+ import { getLicenseStatus } from '@progress/kendo-licensing';
12
13
 
13
14
  /**
14
15
  * @hidden
@@ -204,6 +205,26 @@ const areObjectsEqual = (firstObject, secondObject) => {
204
205
  return equalSettings.length === Object.keys(firstObject).length;
205
206
  };
206
207
 
208
+ const processCssValue = (value) => {
209
+ if (typeof value === 'number') {
210
+ return `${value}px`;
211
+ }
212
+ else if (typeof value === 'string') {
213
+ const trimmedValue = value.trim();
214
+ const numValue = parseInt(trimmedValue, 10);
215
+ if (!isNaN(numValue) && Number.isFinite(numValue)) {
216
+ if (numValue.toString() === trimmedValue) {
217
+ return `${numValue}px`;
218
+ }
219
+ else {
220
+ return value;
221
+ }
222
+ }
223
+ return null;
224
+ }
225
+ return null;
226
+ };
227
+
207
228
  class DraggableDirective {
208
229
  element;
209
230
  ngZone;
@@ -774,64 +795,71 @@ class KendoInput {
774
795
  */
775
796
  var Keys;
776
797
  (function (Keys) {
777
- Keys[Keys["Alt"] = 18] = "Alt";
778
- Keys[Keys["ArrowDown"] = 40] = "ArrowDown";
779
- Keys[Keys["ArrowLeft"] = 37] = "ArrowLeft";
780
- Keys[Keys["ArrowRight"] = 39] = "ArrowRight";
781
- Keys[Keys["ArrowUp"] = 38] = "ArrowUp";
782
- Keys[Keys["Backspace"] = 8] = "Backspace";
783
- Keys[Keys["Control"] = 17] = "Control";
784
- Keys[Keys["Delete"] = 46] = "Delete";
785
- Keys[Keys["Digit0"] = 48] = "Digit0";
786
- Keys[Keys["Digit1"] = 49] = "Digit1";
787
- Keys[Keys["Digit2"] = 50] = "Digit2";
788
- Keys[Keys["Digit3"] = 51] = "Digit3";
789
- Keys[Keys["Digit4"] = 52] = "Digit4";
790
- Keys[Keys["Digit5"] = 53] = "Digit5";
791
- Keys[Keys["Digit6"] = 54] = "Digit6";
792
- Keys[Keys["Digit7"] = 55] = "Digit7";
793
- Keys[Keys["Digit8"] = 56] = "Digit8";
794
- Keys[Keys["Digit9"] = 57] = "Digit9";
795
- Keys[Keys["End"] = 35] = "End";
796
- Keys[Keys["Enter"] = 13] = "Enter";
797
- Keys[Keys["Escape"] = 27] = "Escape";
798
- Keys[Keys["F1"] = 112] = "F1";
799
- Keys[Keys["F2"] = 113] = "F2";
800
- Keys[Keys["F10"] = 121] = "F10";
801
- Keys[Keys["Home"] = 36] = "Home";
802
- Keys[Keys["Insert"] = 45] = "Insert";
803
- Keys[Keys["KeyA"] = 65] = "KeyA";
804
- Keys[Keys["KeyB"] = 66] = "KeyB";
805
- Keys[Keys["KeyC"] = 67] = "KeyC";
806
- Keys[Keys["KeyD"] = 68] = "KeyD";
807
- Keys[Keys["KeyE"] = 69] = "KeyE";
808
- Keys[Keys["KeyF"] = 70] = "KeyF";
809
- Keys[Keys["KeyG"] = 71] = "KeyG";
810
- Keys[Keys["KeyH"] = 72] = "KeyH";
811
- Keys[Keys["KeyI"] = 73] = "KeyI";
812
- Keys[Keys["KeyJ"] = 74] = "KeyJ";
813
- Keys[Keys["KeyK"] = 75] = "KeyK";
814
- Keys[Keys["KeyL"] = 76] = "KeyL";
815
- Keys[Keys["KeyM"] = 77] = "KeyM";
816
- Keys[Keys["KeyN"] = 78] = "KeyN";
817
- Keys[Keys["KeyO"] = 79] = "KeyO";
818
- Keys[Keys["KeyP"] = 80] = "KeyP";
819
- Keys[Keys["KeyQ"] = 81] = "KeyQ";
820
- Keys[Keys["KeyR"] = 82] = "KeyR";
821
- Keys[Keys["KeyS"] = 83] = "KeyS";
822
- Keys[Keys["KeyT"] = 84] = "KeyT";
823
- Keys[Keys["KeyU"] = 85] = "KeyU";
824
- Keys[Keys["KeyV"] = 86] = "KeyV";
825
- Keys[Keys["KeyW"] = 87] = "KeyW";
826
- Keys[Keys["KeyX"] = 88] = "KeyX";
827
- Keys[Keys["KeyY"] = 89] = "KeyY";
828
- Keys[Keys["KeyZ"] = 90] = "KeyZ";
829
- Keys[Keys["NumpadDecimal"] = 110] = "NumpadDecimal";
830
- Keys[Keys["PageDown"] = 34] = "PageDown";
831
- Keys[Keys["PageUp"] = 33] = "PageUp";
832
- Keys[Keys["Shift"] = 16] = "Shift";
833
- Keys[Keys["Space"] = 32] = "Space";
834
- Keys[Keys["Tab"] = 9] = "Tab";
798
+ Keys["ArrowDown"] = "ArrowDown";
799
+ Keys["ArrowLeft"] = "ArrowLeft";
800
+ Keys["ArrowRight"] = "ArrowRight";
801
+ Keys["ArrowUp"] = "ArrowUp";
802
+ Keys["Backspace"] = "Backspace";
803
+ Keys["Delete"] = "Delete";
804
+ Keys["Digit0"] = "Digit0";
805
+ Keys["Digit1"] = "Digit1";
806
+ Keys["Digit2"] = "Digit2";
807
+ Keys["Digit3"] = "Digit3";
808
+ Keys["Digit4"] = "Digit4";
809
+ Keys["Digit5"] = "Digit5";
810
+ Keys["Digit6"] = "Digit6";
811
+ Keys["Digit7"] = "Digit7";
812
+ Keys["Digit8"] = "Digit8";
813
+ Keys["Digit9"] = "Digit9";
814
+ Keys["End"] = "End";
815
+ Keys["Enter"] = "Enter";
816
+ Keys["Escape"] = "Escape";
817
+ Keys["F1"] = "F1";
818
+ Keys["F2"] = "F2";
819
+ Keys["F10"] = "F10";
820
+ Keys["Home"] = "Home";
821
+ Keys["KeyA"] = "KeyA";
822
+ Keys["KeyB"] = "KeyB";
823
+ Keys["KeyC"] = "KeyC";
824
+ Keys["KeyD"] = "KeyD";
825
+ Keys["KeyE"] = "KeyE";
826
+ Keys["KeyF"] = "KeyF";
827
+ Keys["KeyG"] = "KeyG";
828
+ Keys["KeyH"] = "KeyH";
829
+ Keys["KeyI"] = "KeyI";
830
+ Keys["KeyJ"] = "KeyJ";
831
+ Keys["KeyK"] = "KeyK";
832
+ Keys["KeyL"] = "KeyL";
833
+ Keys["KeyM"] = "KeyM";
834
+ Keys["KeyN"] = "KeyN";
835
+ Keys["KeyO"] = "KeyO";
836
+ Keys["KeyP"] = "KeyP";
837
+ Keys["KeyQ"] = "KeyQ";
838
+ Keys["KeyR"] = "KeyR";
839
+ Keys["KeyS"] = "KeyS";
840
+ Keys["KeyT"] = "KeyT";
841
+ Keys["KeyU"] = "KeyU";
842
+ Keys["KeyV"] = "KeyV";
843
+ Keys["KeyW"] = "KeyW";
844
+ Keys["KeyX"] = "KeyX";
845
+ Keys["KeyY"] = "KeyY";
846
+ Keys["KeyZ"] = "KeyZ";
847
+ Keys["Numpad1"] = "Numpad1";
848
+ Keys["Numpad2"] = "Numpad2";
849
+ Keys["Numpad3"] = "Numpad3";
850
+ Keys["Numpad4"] = "Numpad4";
851
+ Keys["Numpad5"] = "Numpad5";
852
+ Keys["Numpad6"] = "Numpad6";
853
+ Keys["Numpad7"] = "Numpad7";
854
+ Keys["Numpad8"] = "Numpad8";
855
+ Keys["Numpad9"] = "Numpad9";
856
+ Keys["Numpad0"] = "Numpad0";
857
+ Keys["NumpadEnter"] = "NumpadEnter";
858
+ Keys["NumpadDecimal"] = "NumpadDecimal";
859
+ Keys["PageDown"] = "PageDown";
860
+ Keys["PageUp"] = "PageUp";
861
+ Keys["Space"] = "Space";
862
+ Keys["Tab"] = "Tab";
835
863
  })(Keys || (Keys = {}));
836
864
 
837
865
  /**
@@ -851,6 +879,42 @@ const focusableSelector = [
851
879
  '*[contenteditable]:not([tabindex^="-"]):not([disabled]):not([contenteditable="false"])'
852
880
  ].join(',');
853
881
 
882
+ /**
883
+ * @hidden
884
+ *
885
+ * On some keyboards, PageUp/Down, Home/End, and arrow keys are mapped to Numpad keys
886
+ */
887
+ const normalizeNumpadKeys = (event) => {
888
+ if (event.code === Keys.Numpad1 && event.key === Keys.End) {
889
+ return Keys.End;
890
+ }
891
+ if (event.code === Keys.Numpad2 && event.key === Keys.ArrowDown) {
892
+ return Keys.ArrowDown;
893
+ }
894
+ if (event.code === Keys.Numpad3 && event.key === Keys.PageDown) {
895
+ return Keys.PageDown;
896
+ }
897
+ if (event.code === Keys.Numpad4 && event.key === Keys.ArrowLeft) {
898
+ return Keys.ArrowLeft;
899
+ }
900
+ if (event.code === Keys.Numpad6 && event.key === Keys.ArrowRight) {
901
+ return Keys.ArrowRight;
902
+ }
903
+ if (event.code === Keys.Numpad7 && event.key === Keys.Home) {
904
+ return Keys.Home;
905
+ }
906
+ if (event.code === Keys.Numpad8 && event.key === Keys.ArrowUp) {
907
+ return Keys.ArrowUp;
908
+ }
909
+ if (event.code === Keys.Numpad9 && event.key === Keys.PageUp) {
910
+ return Keys.PageUp;
911
+ }
912
+ if (event.code === Keys.NumpadEnter) {
913
+ return Keys.Enter;
914
+ }
915
+ return event.code;
916
+ };
917
+
854
918
  /**
855
919
  * @hidden
856
920
  */
@@ -912,6 +976,7 @@ let bannerPresentOnPage = false;
912
976
  */
913
977
  class WatermarkOverlayComponent {
914
978
  watermarkStyle = watermarkStyles;
979
+ licenseMessage;
915
980
  banner;
916
981
  isOpen = true;
917
982
  bannerMounted = false;
@@ -941,7 +1006,7 @@ class WatermarkOverlayComponent {
941
1006
  return isDocumentAvailable() && this.banner && this.banner.nativeElement;
942
1007
  }
943
1008
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: WatermarkOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: WatermarkOverlayComponent, isStandalone: true, selector: "div[kendoWatermarkOverlay]", host: { properties: { "style": "this.watermarkStyle" } }, viewQueries: [{ propertyName: "banner", first: true, predicate: ["banner"], descendants: true }], ngImport: i0, template: `
1009
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: WatermarkOverlayComponent, isStandalone: true, selector: "div[kendoWatermarkOverlay]", inputs: { licenseMessage: "licenseMessage" }, host: { properties: { "style": "this.watermarkStyle" } }, viewQueries: [{ propertyName: "banner", first: true, predicate: ["banner"], descendants: true }], ngImport: i0, template: `
945
1010
  <div #banner *ngIf="isOpen && bannerMounted" [ngStyle]="bannerStyles">
946
1011
  <span [ngStyle]="{ display: 'flex', alignSelf: 'center', marginRight: '8px' }">
947
1012
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
@@ -949,7 +1014,8 @@ class WatermarkOverlayComponent {
949
1014
  </svg>
950
1015
  </span>
951
1016
 
952
- <span>
1017
+ <span *ngIf="licenseMessage" [innerHtml]="licenseMessage"></span>
1018
+ <span *ngIf="!licenseMessage">
953
1019
  We couldn't verify your <a [href]="licenseKeyUrl">license key</a> for Kendo UI for Angular. Please see the browser
954
1020
  console for details and resolution steps.
955
1021
  </span>
@@ -976,7 +1042,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
976
1042
  </svg>
977
1043
  </span>
978
1044
 
979
- <span>
1045
+ <span *ngIf="licenseMessage" [innerHtml]="licenseMessage"></span>
1046
+ <span *ngIf="!licenseMessage">
980
1047
  We couldn't verify your <a [href]="licenseKeyUrl">license key</a> for Kendo UI for Angular. Please see the browser
981
1048
  console for details and resolution steps.
982
1049
  </span>
@@ -996,6 +1063,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
996
1063
  }], propDecorators: { watermarkStyle: [{
997
1064
  type: HostBinding,
998
1065
  args: ['style']
1066
+ }], licenseMessage: [{
1067
+ type: Input
999
1068
  }], banner: [{
1000
1069
  type: ViewChild,
1001
1070
  args: ['banner']
@@ -1009,6 +1078,15 @@ function shouldShowValidationUI(isPackageValid) {
1009
1078
  const skip = allowed.some((hostname) => globalThis.document?.location.hostname.endsWith(hostname));
1010
1079
  return !skip && !isPackageValid;
1011
1080
  }
1081
+ /**
1082
+ * @hidden
1083
+ *
1084
+ * Returns the notification message to display, if any.
1085
+ */
1086
+ function getLicenseMessage(meta) {
1087
+ const message = getLicenseStatus(meta).message;
1088
+ return message?.notificationMessage;
1089
+ }
1012
1090
 
1013
1091
  /**
1014
1092
  * Specifies the adornments in the prefix container of the [Inputs](slug:adornments_textbox#toc-prefix-adornments) and [DropDowns](slug:adornments_multiselect#toc-prefix-adornments).
@@ -1374,12 +1452,14 @@ class ToggleButtonTabStopDirective {
1374
1452
  this.renderer.removeStyle(this.button, 'box-shadow');
1375
1453
  };
1376
1454
  onClick = (e) => {
1377
- const splitButtonToggleEnter = e instanceof KeyboardEvent && e.keyCode === Keys.Enter;
1455
+ const code = normalizeNumpadKeys(e);
1456
+ const splitButtonToggleEnter = e instanceof KeyboardEvent && code === Keys.Enter;
1378
1457
  const isClick = e instanceof PointerEvent;
1379
1458
  (splitButtonToggleEnter || isClick) && (this.focusButton = true);
1380
1459
  };
1381
1460
  onKeyDown = (e) => {
1382
- if (e.keyCode === Keys.ArrowDown && e.altKey) {
1461
+ const code = normalizeNumpadKeys(e);
1462
+ if (code === Keys.ArrowDown && e.altKey) {
1383
1463
  e.stopImmediatePropagation();
1384
1464
  this.focusButton = true;
1385
1465
  this.button.click();
@@ -1555,5 +1635,5 @@ const replaceMessagePlaceholder = (message, name, value) => (message ?? '').repl
1555
1635
  * Generated bundle index. Do not edit.
1556
1636
  */
1557
1637
 
1558
- export { DraggableDirective, EventsOutsideAngularDirective, KENDO_ADORNMENTS, KENDO_COMMON, KENDO_DRAGGABLE, KENDO_EVENTS, KENDO_RESIZESENSOR, KENDO_TEMPLATE_CONTEXT, KENDO_TOGGLEBUTTONTABSTOP, KENDO_WATERMARK, KendoInput, Keys, MultiTabStop, PrefixTemplateDirective, PreventableEvent, ResizeBatchService, ResizeCompatService, ResizeObserverService, ResizeSensorComponent, ScrollbarWidthService, SeparatorComponent, SuffixTemplateDirective, TemplateContextDirective, ToggleButtonTabStopDirective, WatermarkOverlayComponent, anyChanged, applyAttributes, areObjectsEqual, closest, closestBySelector, closestInScope, contains, findElement, findFocusable, findFocusableChild, focusableSelector, guid, hasClasses, hasObservers, isChanged, isControlRequired, isDocumentAvailable, isFirefox, isFocusable, isFocusableWithTabKey, isObject, isObjectPresent, isPresent, isSafari, isString, isVisible, matchesClasses, matchesNodeName, parseAttributes, parseCSSClassNames, removeHTMLAttributes, replaceMessagePlaceholder, rtlScrollPosition, scrollbarWidth, setHTMLAttributes, shouldShowValidationUI, splitStringToArray };
1638
+ export { DraggableDirective, EventsOutsideAngularDirective, KENDO_ADORNMENTS, KENDO_COMMON, KENDO_DRAGGABLE, KENDO_EVENTS, KENDO_RESIZESENSOR, KENDO_TEMPLATE_CONTEXT, KENDO_TOGGLEBUTTONTABSTOP, KENDO_WATERMARK, KendoInput, Keys, MultiTabStop, PrefixTemplateDirective, PreventableEvent, ResizeBatchService, ResizeCompatService, ResizeObserverService, ResizeSensorComponent, ScrollbarWidthService, SeparatorComponent, SuffixTemplateDirective, TemplateContextDirective, ToggleButtonTabStopDirective, WatermarkOverlayComponent, anyChanged, applyAttributes, areObjectsEqual, closest, closestBySelector, closestInScope, contains, findElement, findFocusable, findFocusableChild, focusableSelector, getLicenseMessage, guid, hasClasses, hasObservers, isChanged, isControlRequired, isDocumentAvailable, isFirefox, isFocusable, isFocusableWithTabKey, isObject, isObjectPresent, isPresent, isSafari, isString, isVisible, matchesClasses, matchesNodeName, normalizeNumpadKeys, parseAttributes, parseCSSClassNames, processCssValue, removeHTMLAttributes, replaceMessagePlaceholder, rtlScrollPosition, scrollbarWidth, setHTMLAttributes, shouldShowValidationUI, splitStringToArray };
1559
1639
 
package/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export * from './utils';
11
11
  export * from './enums';
12
12
  export * from './utils/focusable-selectors';
13
13
  export * from './utils/ng-class-parser';
14
+ export * from './utils/numpad-keys-normalizer';
14
15
  export * from './watermark';
15
16
  export * from './adornments';
16
17
  export { PreventableEvent } from './preventable-event';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-common",
3
- "version": "19.3.0-develop.8",
3
+ "version": "19.3.0",
4
4
  "description": "Kendo UI for Angular - Utility Package",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -23,7 +23,7 @@
23
23
  "@progress/kendo-common": "^1.0.1",
24
24
  "@progress/kendo-draggable": "^3.0.2",
25
25
  "tslib": "^2.3.1",
26
- "@progress/kendo-angular-schematics": "19.3.0-develop.8"
26
+ "@progress/kendo-angular-schematics": "19.3.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
@@ -0,0 +1,10 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ /**
6
+ * @hidden
7
+ *
8
+ * On some keyboards, PageUp/Down, Home/End, and arrow keys are mapped to Numpad keys
9
+ */
10
+ export declare const normalizeNumpadKeys: (event: KeyboardEvent) => string;
@@ -0,0 +1,5 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ export declare const processCssValue: (value: number | string) => string | null;
package/utils.d.ts CHANGED
@@ -11,3 +11,4 @@ export { isSafari, isFirefox } from './utils/detect-browser';
11
11
  export * from './utils/html-attributes';
12
12
  export { isControlRequired } from './utils/forms-utils';
13
13
  export { areObjectsEqual } from './utils/objects-equal';
14
+ export { processCssValue } from './utils/process-css-value';
@@ -3,4 +3,4 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  export { WatermarkOverlayComponent } from './watermark.component';
6
- export { shouldShowValidationUI } from './validation';
6
+ export { shouldShowValidationUI, getLicenseMessage } from './validation';
@@ -2,7 +2,14 @@
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 { PackageMetadata } from "@progress/kendo-licensing";
5
6
  /**
6
7
  * @hidden
7
8
  */
8
9
  export declare function shouldShowValidationUI(isPackageValid: boolean): boolean;
10
+ /**
11
+ * @hidden
12
+ *
13
+ * Returns the notification message to display, if any.
14
+ */
15
+ export declare function getLicenseMessage(meta: PackageMetadata): string | undefined;
@@ -9,6 +9,7 @@ import * as i0 from "@angular/core";
9
9
  */
10
10
  export declare class WatermarkOverlayComponent implements OnInit, AfterViewInit, OnDestroy {
11
11
  watermarkStyle: string;
12
+ licenseMessage?: string;
12
13
  banner: ElementRef;
13
14
  isOpen: boolean;
14
15
  bannerMounted: boolean;
@@ -47,5 +48,5 @@ export declare class WatermarkOverlayComponent implements OnInit, AfterViewInit,
47
48
  closeBanner(): void;
48
49
  get isBannerRendered(): boolean;
49
50
  static ɵfac: i0.ɵɵFactoryDeclaration<WatermarkOverlayComponent, never>;
50
- static ɵcmp: i0.ɵɵComponentDeclaration<WatermarkOverlayComponent, "div[kendoWatermarkOverlay]", never, {}, {}, never, never, true, never>;
51
+ static ɵcmp: i0.ɵɵComponentDeclaration<WatermarkOverlayComponent, "div[kendoWatermarkOverlay]", never, { "licenseMessage": { "alias": "licenseMessage"; "required": false; }; }, {}, never, never, true, never>;
51
52
  }