@sapudex/web-components 2.4.0 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/AssetsVariables.js +6 -1
  2. package/dist/AssetsVariables.js.map +1 -1
  3. package/dist/MastheadCountrySelector.d.ts +9 -0
  4. package/dist/MastheadCountrySelector.js +16 -3
  5. package/dist/MastheadCountrySelector.js.map +1 -1
  6. package/dist/MastheadItem.d.ts +21 -8
  7. package/dist/MastheadItem.js +52 -22
  8. package/dist/MastheadItem.js.map +1 -1
  9. package/dist/MastheadMenu.d.ts +3 -0
  10. package/dist/MastheadMenu.js +3 -0
  11. package/dist/MastheadMenu.js.map +1 -1
  12. package/dist/MastheadMenuItem.d.ts +1 -1
  13. package/dist/MastheadMenuItem.js +1 -1
  14. package/dist/MastheadMenuItem.js.map +1 -1
  15. package/dist/MastheadMobileMenu.d.ts +6 -0
  16. package/dist/MastheadMobileMenu.js +13 -2
  17. package/dist/MastheadMobileMenu.js.map +1 -1
  18. package/dist/MastheadProfileMenu.d.ts +4 -4
  19. package/dist/MastheadProfileMenu.js +7 -0
  20. package/dist/MastheadProfileMenu.js.map +1 -1
  21. package/dist/MastheadShell.d.ts +12 -4
  22. package/dist/MastheadShell.js +19 -10
  23. package/dist/MastheadShell.js.map +1 -1
  24. package/dist/MediaPlayer.d.ts +0 -1
  25. package/dist/MediaPlayer.js +0 -1
  26. package/dist/MediaPlayer.js.map +1 -1
  27. package/dist/MessageStripTemplate.js +1 -1
  28. package/dist/MessageStripTemplate.js.map +1 -1
  29. package/dist/SecondaryNavigation.d.ts +11 -0
  30. package/dist/SecondaryNavigation.js +11 -0
  31. package/dist/SecondaryNavigation.js.map +1 -1
  32. package/dist/assets/{InputSuggestions-CYW_6A8K.js → InputSuggestions-BaPMxFm1.js} +1 -1
  33. package/dist/assets/{ListItemStandardExpandableTextTemplate-BDrgWGjT.js → ListItemStandardExpandableTextTemplate-87ypSvqu.js} +1 -1
  34. package/dist/assets/{bundle.esm-DRCvw6Ji.js → bundle.esm-CoBHnkfj.js} +239 -234
  35. package/dist/assets/messagebundle_en-DXEe5nWA.js +1 -0
  36. package/dist/css/themes/Button.css +1 -1
  37. package/dist/css/themes/MastheadItem.css +1 -1
  38. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  39. package/dist/css/themes/Modal.css +1 -1
  40. package/dist/css/themes/RatingIndicator.css +1 -1
  41. package/dist/css/themes/Search.css +1 -1
  42. package/dist/css/themes/Slider.css +1 -1
  43. package/dist/css/themes/TabInOverflow.css +1 -1
  44. package/dist/custom-elements-internal.json +151 -138
  45. package/dist/custom-elements.json +135 -122
  46. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  47. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  48. package/dist/generated/i18n/i18n-defaults.js +2 -1
  49. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  50. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
  51. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  52. package/dist/generated/templates/MastheadItemTemplate.lit.js +6 -6
  53. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  54. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  55. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  56. package/dist/generated/templates/MastheadMenuTemplate.lit.js +2 -2
  57. package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
  58. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +14 -14
  59. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  60. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
  61. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  62. package/dist/generated/templates/MastheadShellTemplate.lit.js +2 -2
  63. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  64. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +1 -1
  65. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  66. package/dist/generated/themes/Button.css.d.ts +1 -1
  67. package/dist/generated/themes/Button.css.js +1 -1
  68. package/dist/generated/themes/Button.css.js.map +1 -1
  69. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  70. package/dist/generated/themes/MastheadItem.css.js +1 -1
  71. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  72. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  73. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  74. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  75. package/dist/generated/themes/Modal.css.d.ts +1 -1
  76. package/dist/generated/themes/Modal.css.js +1 -1
  77. package/dist/generated/themes/Modal.css.js.map +1 -1
  78. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  79. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  80. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  81. package/dist/generated/themes/Search.css.d.ts +1 -1
  82. package/dist/generated/themes/Search.css.js +1 -1
  83. package/dist/generated/themes/Search.css.js.map +1 -1
  84. package/dist/generated/themes/Slider.css.d.ts +1 -1
  85. package/dist/generated/themes/Slider.css.js +1 -1
  86. package/dist/generated/themes/Slider.css.js.map +1 -1
  87. package/dist/generated/themes/TabInOverflow.css.d.ts +1 -1
  88. package/dist/generated/themes/TabInOverflow.css.js +1 -1
  89. package/dist/generated/themes/TabInOverflow.css.js.map +1 -1
  90. package/dist/messagebundle.properties +3 -0
  91. package/dist/messagebundle_en.properties +1 -0
  92. package/dist/types/AnalyticsName.d.ts +5 -0
  93. package/dist/types/AnalyticsName.js +7 -0
  94. package/dist/types/AnalyticsName.js.map +1 -0
  95. package/dist/types/EventRibbon.d.ts +38 -13
  96. package/dist/types/EventRibbon.js +39 -12
  97. package/dist/types/EventRibbon.js.map +1 -1
  98. package/dist/vscode.html-custom-data.json +6 -25
  99. package/dist/web-types.json +13 -15
  100. package/package.json +1 -1
  101. package/src/AssetsVariables.ts +6 -1
  102. package/src/MastheadCountrySelector.hbs +3 -0
  103. package/src/MastheadCountrySelector.ts +24 -4
  104. package/src/MastheadItem.hbs +22 -14
  105. package/src/MastheadItem.ts +71 -26
  106. package/src/MastheadMenu.hbs +6 -1
  107. package/src/MastheadMenu.ts +5 -0
  108. package/src/MastheadMenuItem.hbs +1 -1
  109. package/src/MastheadMenuItem.ts +2 -2
  110. package/src/MastheadMobileMenu.hbs +24 -9
  111. package/src/MastheadMobileMenu.ts +19 -3
  112. package/src/MastheadProfileMenu.hbs +2 -0
  113. package/src/MastheadProfileMenu.ts +11 -5
  114. package/src/MastheadShell.hbs +2 -0
  115. package/src/MastheadShell.ts +31 -14
  116. package/src/MediaPlayer.ts +0 -1
  117. package/src/MessageStripTemplate.tsx +1 -0
  118. package/src/SecondaryNavigation.hbs +6 -1
  119. package/src/SecondaryNavigation.ts +22 -0
  120. package/src/generated/i18n/i18n-defaults.ts +2 -2
  121. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
  122. package/src/generated/templates/MastheadItemTemplate.lit.ts +6 -6
  123. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  124. package/src/generated/templates/MastheadMenuTemplate.lit.ts +2 -2
  125. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +14 -14
  126. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
  127. package/src/generated/templates/MastheadShellTemplate.lit.ts +2 -2
  128. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +1 -1
  129. package/src/generated/themes/Button.css.ts +1 -1
  130. package/src/generated/themes/MastheadItem.css.ts +1 -1
  131. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  132. package/src/generated/themes/Modal.css.ts +1 -1
  133. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  134. package/src/generated/themes/Search.css.ts +1 -1
  135. package/src/generated/themes/Slider.css.ts +1 -1
  136. package/src/generated/themes/TabInOverflow.css.ts +1 -1
  137. package/src/i18n/messagebundle.properties +3 -0
  138. package/src/i18n/messagebundle_en.properties +1 -0
  139. package/src/themes/Button.css +1 -0
  140. package/src/themes/MastheadItem.css +15 -0
  141. package/src/themes/MastheadProfileMenu.css +2 -1
  142. package/src/themes/Modal.css +2 -2
  143. package/src/themes/Search.css +2 -1
  144. package/src/themes/TabInOverflow.css +1 -1
  145. package/src/types/AnalyticsName.ts +6 -0
  146. package/src/types/EventRibbon.ts +38 -13
  147. package/dist/assets/messagebundle_en-BK8-Eyic.js +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.4.0",
4
+ "version": "2.4.2",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -1326,7 +1326,7 @@
1326
1326
  "name": "background-color-scheme",
1327
1327
  "description": "Defines the solid background color.",
1328
1328
  "value": {
1329
- "type": "\"Mango1\" | \"Mango2\" | \"Mango3\" | \"Mango4\" | \"Red1\" | \"Red2\" | \"Red3\" | \"Red4\" | \"Raspberry1\" | \"Raspberry2\" | \"Raspberry3\" | \"Raspberry4\" | \"Pink1\" | \"Pink2\" | \"Pink3\" | \"Pink4\" | ... 19 more ... | \"Grey4\"",
1329
+ "type": "UDExEventRibbonColorSheme",
1330
1330
  "default": "\"Blue\""
1331
1331
  }
1332
1332
  },
@@ -1369,9 +1369,7 @@
1369
1369
  {
1370
1370
  "name": "background-color-scheme",
1371
1371
  "description": "Defines the solid background color.",
1372
- "value": {
1373
- "type": "\"Mango1\" | \"Mango2\" | \"Mango3\" | \"Mango4\" | \"Red1\" | \"Red2\" | \"Red3\" | \"Red4\" | \"Raspberry1\" | \"Raspberry2\" | \"Raspberry3\" | \"Raspberry4\" | \"Pink1\" | \"Pink2\" | \"Pink3\" | \"Pink4\" | ... 19 more ... | \"Grey4\""
1374
- }
1372
+ "value": { "type": "UDExEventRibbonColorSheme" }
1375
1373
  },
1376
1374
  {
1377
1375
  "name": "background-image",
@@ -3380,11 +3378,6 @@
3380
3378
  "description": "Defines a title for sub menu items",
3381
3379
  "value": { "type": "string", "default": "\"\"" }
3382
3380
  },
3383
- {
3384
- "name": "text",
3385
- "description": "Defines the text of item.",
3386
- "value": { "type": "string", "default": "\"\"" }
3387
- },
3388
3381
  {
3389
3382
  "name": "selected",
3390
3383
  "description": "Defines the selected item.",
@@ -3439,6 +3432,11 @@
3439
3432
  "name": "hide-active-border",
3440
3433
  "description": "Hide active border for item",
3441
3434
  "value": { "type": "boolean", "default": "\"\"" }
3435
+ },
3436
+ {
3437
+ "name": "label",
3438
+ "description": "Defines the label for analytics",
3439
+ "value": { "type": "string" }
3442
3440
  }
3443
3441
  ],
3444
3442
  "slots": [
@@ -3471,11 +3469,6 @@
3471
3469
  "description": "Defines a title for sub menu items",
3472
3470
  "value": { "type": "string" }
3473
3471
  },
3474
- {
3475
- "name": "text",
3476
- "description": "Defines the text of item.",
3477
- "value": { "type": "string" }
3478
- },
3479
3472
  {
3480
3473
  "name": "selected",
3481
3474
  "description": "Defines the selected item.",
@@ -3530,6 +3523,11 @@
3530
3523
  "name": "hide-active-border",
3531
3524
  "description": "Hide active border for item",
3532
3525
  "value": { "type": "boolean" }
3526
+ },
3527
+ {
3528
+ "name": "label",
3529
+ "description": "Defines the label for analytics",
3530
+ "value": { "type": "string" }
3533
3531
  }
3534
3532
  ],
3535
3533
  "events": [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.4.0",
4
+ "version": "2.4.2",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
@@ -25,8 +25,13 @@ const variablesOverwrite = `:root {
25
25
  ${getScopedVarName("--_ui5_calendar_header_padding")}: 0;
26
26
  ${getScopedVarName("--_ui5_calendar_left_right_padding")}: 0;
27
27
  ${getScopedVarName("--_ui5_calendar_top_bottom_padding")}: 0;
28
+
29
+ /* Avatar */
30
+ [udex-avatar].dark {
31
+ ${getScopedVarName("--_ui5_avatar_outline")}: var(--sapContent_FocusWidth) var(--sapContent_FocusStyle) var(--udexColorNeutralWhite, #FFFFFF);
32
+ }
28
33
 
29
- udex-search {
34
+ [udex-search] {
30
35
  ${getScopedVarName("--_ui5_button_pressed_focused_border_color")}: transparent;
31
36
  }
32
37
 
@@ -9,6 +9,7 @@
9
9
  @click="{{backToRegions}}"
10
10
  label="{{_activeRegion?.title}}"
11
11
  type="Button"
12
+ part="menu-item"
12
13
  is-back
13
14
  icon-start>
14
15
  </udex-masthead-menu-item>
@@ -35,6 +36,7 @@
35
36
  url="{{this.url}}"
36
37
  label="{{this.displayTitle}}"
37
38
  index="{{@index}}"
39
+ part="menu-item"
38
40
  is-nav-item>
39
41
  </udex-masthead-menu-item>
40
42
  </li>
@@ -55,6 +57,7 @@
55
57
  aria-has-popup="true"
56
58
  accessible-role="button"
57
59
  type="Button"
60
+ part="menu-item"
58
61
  is-nav-item
59
62
  has-border
60
63
  icon-end
@@ -11,8 +11,10 @@ import {
11
11
  } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import UDExMastheadMenuItem from "./MastheadMenuItem.js";
13
13
  import UDExSearch, { Mode as UDExSearchMode } from "./Search.js";
14
-
15
14
  import MastheadCountrySelectorTemplate from "./generated/templates/MastheadCountrySelectorTemplate.lit.js";
15
+ import AnalyticsName from "./types/AnalyticsName.js";
16
+ import { BreakpointUtils } from "./utils/Breakpoints.js";
17
+ import type UDExMastheadShell from "./MastheadShell.js";
16
18
 
17
19
  // Styles
18
20
  import MastheadCountrySelectorCss from "./generated/themes/MastheadCountrySelector.css.js";
@@ -23,6 +25,8 @@ type UDExMastheadCountrySelectorRegionClickEventDetail = {
23
25
  countries: Array<Country>,
24
26
  },
25
27
  originalEvent: Event,
28
+ analyticsName: AnalyticsName,
29
+ sourceNode: HTMLElement,
26
30
  }
27
31
 
28
32
  type UDExMastheadCountrySelectorItemClickEventDetail = {
@@ -32,10 +36,13 @@ type UDExMastheadCountrySelectorItemClickEventDetail = {
32
36
  url: string,
33
37
  },
34
38
  originalEvent: Event,
39
+ analyticsName: AnalyticsName,
40
+ sourceNode: HTMLElement,
35
41
  }
36
42
 
37
43
  type UDExMastheadCountrySelectorSearchEventDetail = {
38
44
  value: string,
45
+ analyticsName: AnalyticsName,
39
46
  }
40
47
 
41
48
  export type Region = {
@@ -287,6 +294,7 @@ class UDExMastheadCountrySelector extends UI5Element {
287
294
  this._shouldFocusBackBtn = false;
288
295
  this.fireDecoratorEvent("country-selector-search", {
289
296
  value: e.detail.value,
297
+ analyticsName: AnalyticsName.Header,
290
298
  });
291
299
  this.refreshRendering();
292
300
  }
@@ -323,7 +331,7 @@ class UDExMastheadCountrySelector extends UI5Element {
323
331
 
324
332
  handleOutsideClick(): void {
325
333
  document.addEventListener("mousedown", (e: Event): void => {
326
- if (e.target !== this) {
334
+ if (e.target !== this && !this.isMobile) {
327
335
  this.handleSearchReset();
328
336
  this._isActiveRegionOpen = false;
329
337
  this.setActiveRegion(null);
@@ -412,14 +420,16 @@ class UDExMastheadCountrySelector extends UI5Element {
412
420
  }
413
421
 
414
422
  fireEventRegionItemClick(e: CustomEvent | KeyboardEvent): void {
415
- const { label } = e.target as UDExMastheadMenuItem;
423
+ const item = e.target as UDExMastheadMenuItem;
416
424
 
417
425
  this.fireDecoratorEvent("region-item-click", {
418
426
  item: {
419
- title: label,
427
+ title: item.label,
420
428
  countries: this._activeRegion?.countries || [],
421
429
  },
422
430
  originalEvent: e,
431
+ analyticsName: AnalyticsName.Header,
432
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
423
433
  });
424
434
  }
425
435
 
@@ -434,6 +444,8 @@ class UDExMastheadCountrySelector extends UI5Element {
434
444
  url: url || "",
435
445
  },
436
446
  originalEvent: e,
447
+ analyticsName: AnalyticsName.Header,
448
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
437
449
  });
438
450
  }
439
451
 
@@ -476,6 +488,14 @@ class UDExMastheadCountrySelector extends UI5Element {
476
488
  get isSingleMode(): boolean {
477
489
  return this.regionsData.length === 1;
478
490
  }
491
+
492
+ get isMobile(): boolean {
493
+ return BreakpointUtils.isAtMost("M") || this.mastheadShell?._isMobileMode;
494
+ }
495
+
496
+ get mastheadShell(): UDExMastheadShell {
497
+ return document.querySelector<UDExMastheadShell>("[udex-masthead-shell]")!;
498
+ }
479
499
  }
480
500
 
481
501
  UDExMastheadCountrySelector.define();
@@ -8,7 +8,9 @@
8
8
  href="{{href}}"
9
9
  aria-label="{{accessibleLabel}}"
10
10
  aria-describedby="{{ariaDescribedBy}}"
11
- @click="{{handleItemClick}}">
11
+ @click="{{handleItemClick}}"
12
+ @mousedown="{{handleMouseDown}}"
13
+ @mouseup="{{handleMouseUp}}">
12
14
  {{> content}}
13
15
  </a>
14
16
  {{#if isTargetBlank}}
@@ -28,7 +30,9 @@
28
30
  aria-haspopup="{{hasDropdownSlot}}"
29
31
  aria-label="{{accessibleLabel}}"
30
32
  @keydown="{{handleKeyDown}}"
31
- @click="{{handleItemClick}}">
33
+ @click="{{handleItemClick}}"
34
+ @mousedown="{{handleMouseDown}}"
35
+ @mouseup="{{handleMouseUp}}">
32
36
  {{> content}}
33
37
  </span>
34
38
  {{#if isDropdownOpened}}
@@ -45,6 +49,8 @@
45
49
  aria-haspopup="{{hasDropdownSlot}}"
46
50
  aria-label="{{accessibleLabel}}"
47
51
  @keydown="{{handleKeyDown}}"
52
+ @mousedown="{{handleMouseDown}}"
53
+ @mouseup="{{handleMouseUp}}"
48
54
  @click="{{handleItemClick}}">
49
55
  {{> content}}
50
56
  </button>
@@ -63,18 +69,20 @@
63
69
  mode="Decorative">
64
70
  </ui5-icon>
65
71
  {{else if image}}
66
- <img
67
- class="udex-masthead-item__image"
68
- id="{{this._id}}_image-alt"
69
- src="{{image}}"
70
- alt="{{imageAlt}}"/>
71
- {{#if imageAlt}}
72
- <span
73
- id="image-desc"
74
- class="udex-masthead-hidden-text">
75
- {{imageAlt}}
76
- </span>
77
- {{/if}}
72
+ <div class="udex-masthead-item__image-wrap">
73
+ <img
74
+ class="udex-masthead-item__image"
75
+ id="{{this._id}}_image-alt"
76
+ src="{{image}}"
77
+ alt="{{imageAlt}}"/>
78
+ </div>
79
+ {{#if imageAlt}}
80
+ <span
81
+ id="image-desc"
82
+ class="udex-masthead-hidden-text">
83
+ {{imageAlt}}
84
+ </span>
85
+ {{/if}}
78
86
  {{else}}
79
87
  <span class="udex-masthead-item__text">
80
88
  <slot></slot>
@@ -11,7 +11,7 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
11
11
  import { isEscape } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
13
13
  import {
14
- OPENS_IN_A_NEW_WINDOW, PROFILE, CART, COUNTRY_SELECTOR, SUPPORT,
14
+ OPENS_IN_A_NEW_WINDOW, PROFILE, CART, COUNTRY_SELECTOR, SUPPORT, SEARCH,
15
15
  } from "./generated/i18n/i18n-defaults.js";
16
16
  import UDExMastheadMenu from "./MastheadMenu.js";
17
17
  import type UDExAvatar from "./Avatar.js";
@@ -21,6 +21,7 @@ import MastheadItemTemplate from "./generated/templates/MastheadItemTemplate.lit
21
21
  import { UDExTarget } from "./types/common.js";
22
22
  import { BreakpointUtils } from "./utils/Breakpoints.js";
23
23
  import parseArrayFromString from "./utils/parseArrayFromString.js";
24
+ import AnalyticsName from "./types/AnalyticsName.js";
24
25
 
25
26
  // Styles
26
27
  import MastheadItemCss from "./generated/themes/MastheadItem.css.js";
@@ -58,11 +59,14 @@ export type MenuItem = {
58
59
  type UDExMastheadItemItemClickEventDetail = {
59
60
  originalEvent: PointerEvent,
60
61
  item: UDExMastheadItem,
62
+ analyticsName: AnalyticsName,
63
+ sourceNode: HTMLElement,
61
64
  }
62
65
 
63
66
  export type UDExMastheadDropdownEventDetail = {
64
67
  title: string,
65
68
  action: UDExMastheadDropdownItemAction,
69
+ analyticsName: AnalyticsName,
66
70
  }
67
71
 
68
72
  /**
@@ -142,15 +146,6 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
142
146
  @property({ type: String })
143
147
  menuTitle: string = "";
144
148
 
145
- /**
146
- * Defines the text of item.
147
- *
148
- * @public
149
- * @default ""
150
- */
151
- @property({ type: String })
152
- text: string = "";
153
-
154
149
  /**
155
150
  * Defines the selected item.
156
151
  *
@@ -264,6 +259,14 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
264
259
  @property({ type: Boolean })
265
260
  _isMobileMode!: boolean;
266
261
 
262
+ /**
263
+ * Defines the label for analytics
264
+ *
265
+ * @public
266
+ */
267
+ @property({ type: String })
268
+ label!: string;
269
+
267
270
  /**
268
271
  * Slot for the dropdown
269
272
  *
@@ -282,12 +285,14 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
282
285
  @slot({ type: HTMLElement, "default": true })
283
286
  content?: Array<HTMLElement>;
284
287
 
288
+ @property({ type: Boolean })
289
+ _preventFocusOut!: boolean;
290
+
285
291
  @i18n("@sapudex/web-components")
286
292
  static i18nBundle: I18nBundle;
287
293
 
288
294
  _profileAvatar!: UDExAvatar;
289
295
  _mastheadShell!: UDExMastheadShell;
290
- _isEscPress!: boolean;
291
296
 
292
297
  onEnterDOM(): void {
293
298
  if (isDesktop()) {
@@ -295,6 +300,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
295
300
  }
296
301
  }
297
302
 
303
+ onBeforeRendering(): void {
304
+ this.label = this.eventItemTitle;
305
+ }
306
+
298
307
  onAfterRendering(): void {
299
308
  this._profileAvatar = this.profileAvatar;
300
309
  this._mastheadShell = this.mastheadShell;
@@ -304,14 +313,13 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
304
313
  }
305
314
 
306
315
  this.handleOutsideClick();
307
- this._isEscPress = false;
308
316
  }
309
317
 
310
318
  handleOutsideClick(): void {
311
319
  document.addEventListener("click", (e: Event) => {
312
320
  const target = e.target as HTMLElement;
313
321
  const item = target.closest("[udex-masthead-item]");
314
- if (item !== this && !this.isMobile) {
322
+ if (item !== this && !this.isMobile && this.selected) {
315
323
  if (this.isDropdownOpened) {
316
324
  this.fireDropdownCloseEvent(this.eventItemTitle, UDExMastheadDropdownItemAction.ClickOutside);
317
325
  }
@@ -321,13 +329,27 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
321
329
  });
322
330
  }
323
331
 
332
+ handleMouseDown(): void {
333
+ this._preventFocusOut = true;
334
+ }
335
+
336
+ handleMouseUp(): void {
337
+ this._preventFocusOut = false;
338
+ }
339
+
324
340
  handleFocusout(e: FocusEvent): void {
325
- if (e.relatedTarget === null || this._isEscPress) {
341
+ if (this.isFocusOutPrevented(e)) {
326
342
  return;
327
343
  }
328
344
 
329
- const eTarget = e.target as HTMLElement;
330
- if (!this.isMobile && eTarget.getAttribute("slot") === "dropdown") {
345
+ this.handleFocusOutForDropdowns(e);
346
+ }
347
+
348
+ handleFocusOutForDropdowns(e: FocusEvent): void {
349
+ const relatedTarget = e.relatedTarget as HTMLElement;
350
+ const target = e.target as HTMLElement;
351
+
352
+ if (this.shouldCloseDropdown(relatedTarget, target)) {
331
353
  this.closeDropdown();
332
354
  }
333
355
  }
@@ -343,7 +365,6 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
343
365
  }
344
366
 
345
367
  handleKeyEscape(): void {
346
- this._isEscPress = true;
347
368
  this.closeDropdown();
348
369
  if (this.isProfileBtn) {
349
370
  this._profileAvatar.focus();
@@ -381,17 +402,19 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
381
402
  }
382
403
 
383
404
  fireDropdownCloseEvent(title: string, action: UDExMastheadDropdownItemAction): void {
384
- this.fireDecoratorEvent("dropdown-closed", { title, action });
405
+ this.fireDecoratorEvent("dropdown-closed", { title, action, analyticsName: AnalyticsName.Header });
385
406
  }
386
407
 
387
408
  fireDropdownOpenEvent(title: string, action: UDExMastheadDropdownItemAction): void {
388
- this.fireDecoratorEvent("dropdown-opened", { title, action });
409
+ this.fireDecoratorEvent("dropdown-opened", { title, action, analyticsName: AnalyticsName.Header });
389
410
  }
390
411
 
391
412
  fireItemClickEvent(e: PointerEvent): void {
392
413
  this.fireDecoratorEvent("item-click", {
393
414
  item: this,
394
415
  originalEvent: e,
416
+ analyticsName: AnalyticsName.Header,
417
+ sourceNode: e.currentTarget as HTMLElement,
395
418
  });
396
419
  }
397
420
 
@@ -442,7 +465,7 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
442
465
 
443
466
  closeDropdown(): void {
444
467
  this.selected = false;
445
- this.fireDropdownCloseEvent(this.eventItemTitle, UDExMastheadDropdownItemAction.Close);
468
+ this.fireDropdownCloseEvent(this.accessibleName || this.eventItemTitle, UDExMastheadDropdownItemAction.Close);
446
469
  }
447
470
 
448
471
  getDomElement(selector: string): HTMLElement | undefined | null {
@@ -453,6 +476,28 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
453
476
  return parseArrayFromString(this.subItems);
454
477
  }
455
478
 
479
+ private isFocusOutPrevented(e: FocusEvent): boolean {
480
+ return this.isMobile || e.relatedTarget === null || this._preventFocusOut;
481
+ }
482
+
483
+ private isProfileButtonTarget(relatedTarget: HTMLElement | null): boolean {
484
+ return (relatedTarget?.tagName === "UDEX-AVATAR" || relatedTarget?.tagName === "UDEX-MASTHEAD-ITEM") && this.isProfileBtn;
485
+ }
486
+
487
+ private isNavItemTarget(target: HTMLElement): boolean {
488
+ return target.getAttribute("slot") === "dropdown" && !this.isProfileBtn;
489
+ }
490
+
491
+ private isRelatedTargetOutside(relatedTarget: HTMLElement | null): boolean {
492
+ return relatedTarget?.closest("[udex-masthead-item]") === null;
493
+ }
494
+
495
+ private shouldCloseDropdown(relatedTarget: HTMLElement, target:HTMLElement): boolean {
496
+ return this.isRelatedTargetOutside(relatedTarget)
497
+ || this.isProfileButtonTarget(relatedTarget)
498
+ || this.isNavItemTarget(target);
499
+ }
500
+
456
501
  get mastheadShell(): UDExMastheadShell {
457
502
  return document.querySelector<UDExMastheadShell>("[udex-masthead-shell]")!;
458
503
  }
@@ -532,6 +577,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
532
577
  return this.getAttribute("slot") === "cart";
533
578
  }
534
579
 
580
+ get isSearchBtn(): boolean {
581
+ return this.icon === "search";
582
+ }
583
+
535
584
  get isSupportBtn(): boolean {
536
585
  return this.getAttribute("slot") === "support";
537
586
  }
@@ -553,22 +602,18 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
553
602
  }
554
603
 
555
604
  get eventItemTitle(): string {
556
- if (this.accessibleName) {
557
- return this.accessibleName.trim();
605
+ if (this.isSearchBtn) {
606
+ return UDExMastheadItem.i18nBundle.getText(SEARCH);
558
607
  }
559
-
560
608
  if (this.isCartBtn) {
561
609
  return UDExMastheadItem.i18nBundle.getText(CART);
562
610
  }
563
-
564
611
  if (this.isProfileBtn) {
565
612
  return UDExMastheadItem.i18nBundle.getText(PROFILE);
566
613
  }
567
-
568
614
  if (this.isCountrySelectorBtn) {
569
615
  return UDExMastheadItem.i18nBundle.getText(COUNTRY_SELECTOR);
570
616
  }
571
-
572
617
  if (this.isSupportBtn) {
573
618
  return UDExMastheadItem.i18nBundle.getText(SUPPORT);
574
619
  }
@@ -22,6 +22,8 @@
22
22
  {{#*inline "header"}}
23
23
  <div class="udex-masthead-menu__header">
24
24
  <udex-masthead-menu-item
25
+ part="menu-item"
26
+ exportparts="menu-item"
25
27
  id="category-{{categoryId}}"
26
28
  @click="{{../../handleMenuItemClick}}"
27
29
  url="{{this.url}}"
@@ -42,11 +44,14 @@
42
44
  <li>
43
45
  {{#if this.url}}
44
46
  <udex-masthead-menu-item
47
+ part="menu-item"
48
+ exportparts="menu-item"
45
49
  @click="{{../../../handleMenuItemClick}}"
46
50
  badge="{{this.badge}}"
47
51
  ?external-link="{{this.externalLink}}"
48
52
  url="{{this.url}}"
49
- label="{{this.title}}">
53
+ label="{{this.title}}"
54
+ exportparts="badge">
50
55
  </udex-masthead-menu-item>
51
56
  {{else}}
52
57
  <udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
@@ -12,6 +12,7 @@ import UDExMastheadMenuItem, { UDExItemType } from "./MastheadMenuItem.js";
12
12
  import UDExDivider from "./Divider.js";
13
13
  import MastheadMenuTemplate from "./generated/templates/MastheadMenuTemplate.lit.js";
14
14
  import parseArrayFromString from "./utils/parseArrayFromString.js";
15
+ import AnalyticsName from "./types/AnalyticsName.js";
15
16
 
16
17
  // Styles
17
18
  import MastheadMenuCss from "./generated/themes/MastheadMenu.css.js";
@@ -39,6 +40,8 @@ type UDExMastheadMenuMenuItemClickEventDetail = {
39
40
  category?: string,
40
41
  originalEvent: PointerEvent,
41
42
  item: UDExMastheadMenuItem,
43
+ analyticsName: AnalyticsName,
44
+ sourceNode: HTMLElement,
42
45
  }
43
46
 
44
47
  /**
@@ -131,6 +134,8 @@ class UDExMastheadMenu extends UI5Element {
131
134
  if (url?.length) {
132
135
  const list = item.closest(".udex-masthead-menu__list") as HTMLElement;
133
136
  this.fireDecoratorEvent("menu-item-click", {
137
+ sourceNode: item.shadowRoot?.querySelector(".udex-masthead-menu-item") as HTMLElement,
138
+ analyticsName: AnalyticsName.Header,
134
139
  item,
135
140
  originalEvent: e,
136
141
  ...(type !== UDExItemType.Heading && { category: list?.getAttribute("category") || "" }),
@@ -41,7 +41,7 @@
41
41
  class="udex-masthead-menu-item {{rootClass}}"
42
42
  part="menu-item-button"
43
43
  aria-haspopup="{{ariaHasPopup}}"
44
- role="button"
44
+ role="{{accessibleRoleText}}"
45
45
  tabindex="{{_tabIndex}}">
46
46
  {{#if iconStart}}
47
47
  {{>arrow-left}}
@@ -225,8 +225,8 @@ class UDExMastheadMenuItem extends UI5Element {
225
225
  return this.externalLink ? "new-win-desc" : null;
226
226
  }
227
227
 
228
- get accessibleRoleText(): string | null {
229
- return this.accessibleRole ? this.accessibleRole : null;
228
+ get accessibleRoleText(): string {
229
+ return this.accessibleRole ? this.accessibleRole : "menuitem";
230
230
  }
231
231
 
232
232
  get partAttr(): string {