@sapudex/web-components 2.29.0 → 2.31.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.
Files changed (270) hide show
  1. package/cypress/specs/FilterMenu.cy.tsx +39 -1
  2. package/cypress/specs/List.cy.tsx +171 -0
  3. package/cypress/specs/ListItem.cy.tsx +22 -26
  4. package/cypress/specs/PromoTile.cy.tsx +10 -0
  5. package/cypress/specs/ReviewItem.cy.tsx +48 -14
  6. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +12 -12
  7. package/cypress/specs/SelectBox.cy.tsx +76 -0
  8. package/cypress/support/component-imports.instrumented.ts +4 -0
  9. package/cypress/support/component-imports.src.ts +5 -1
  10. package/dist/Avatar.d.ts +1 -0
  11. package/dist/Avatar.js +9 -0
  12. package/dist/Avatar.js.map +1 -1
  13. package/dist/Breadcrumbs.d.ts +0 -4
  14. package/dist/Breadcrumbs.js +7 -16
  15. package/dist/Breadcrumbs.js.map +1 -1
  16. package/dist/BreadcrumbsTemplate.js +1 -1
  17. package/dist/BreadcrumbsTemplate.js.map +1 -1
  18. package/dist/FilterMenu.d.ts +2 -0
  19. package/dist/FilterMenu.js +2 -0
  20. package/dist/FilterMenu.js.map +1 -1
  21. package/dist/ImageGridTickerTemplate.js +2 -1
  22. package/dist/ImageGridTickerTemplate.js.map +1 -1
  23. package/dist/List.d.ts +4 -2
  24. package/dist/List.js +45 -12
  25. package/dist/List.js.map +1 -1
  26. package/dist/ListGroupHeader.d.ts +4 -0
  27. package/dist/ListGroupHeader.js +26 -1
  28. package/dist/ListGroupHeader.js.map +1 -1
  29. package/dist/ListGroupHeaderBase.js +1 -1
  30. package/dist/ListGroupHeaderBase.js.map +1 -1
  31. package/dist/ListItem.js +1 -1
  32. package/dist/ListItem.js.map +1 -1
  33. package/dist/ListItemBase.d.ts +40 -3
  34. package/dist/ListItemBase.js +70 -9
  35. package/dist/ListItemBase.js.map +1 -1
  36. package/dist/MastheadCountrySelector.d.ts +3 -15
  37. package/dist/MastheadCountrySelector.js +28 -72
  38. package/dist/MastheadCountrySelector.js.map +1 -1
  39. package/dist/MastheadItem.d.ts +10 -2
  40. package/dist/MastheadItem.js +26 -15
  41. package/dist/MastheadItem.js.map +1 -1
  42. package/dist/MastheadMenu.d.ts +2 -2
  43. package/dist/MastheadMenu.js +9 -9
  44. package/dist/MastheadMenu.js.map +1 -1
  45. package/dist/MastheadMenuItem.d.ts +7 -0
  46. package/dist/MastheadMenuItem.js +3 -0
  47. package/dist/MastheadMenuItem.js.map +1 -1
  48. package/dist/MastheadMobileMenu.d.ts +2 -12
  49. package/dist/MastheadMobileMenu.js +31 -116
  50. package/dist/MastheadMobileMenu.js.map +1 -1
  51. package/dist/MastheadProfileMenu.js +1 -1
  52. package/dist/MastheadProfileMenu.js.map +1 -1
  53. package/dist/MastheadShell.d.ts +1 -6
  54. package/dist/MastheadShell.js +7 -44
  55. package/dist/MastheadShell.js.map +1 -1
  56. package/dist/Pagination.d.ts +14 -1
  57. package/dist/Pagination.js +40 -7
  58. package/dist/Pagination.js.map +1 -1
  59. package/dist/PromoTile.d.ts +8 -0
  60. package/dist/PromoTile.js +4 -0
  61. package/dist/PromoTile.js.map +1 -1
  62. package/dist/PromoTileTemplate.js +3 -1
  63. package/dist/PromoTileTemplate.js.map +1 -1
  64. package/dist/ReviewItem.d.ts +8 -7
  65. package/dist/ReviewItem.js +35 -36
  66. package/dist/ReviewItem.js.map +1 -1
  67. package/dist/ReviewItemTemplate.js +3 -1
  68. package/dist/ReviewItemTemplate.js.map +1 -1
  69. package/dist/SearchableListBase.d.ts +3 -0
  70. package/dist/SearchableListBase.js +37 -1
  71. package/dist/SearchableListBase.js.map +1 -1
  72. package/dist/SecondaryNavigationItem.js +7 -1
  73. package/dist/SecondaryNavigationItem.js.map +1 -1
  74. package/dist/SelectBase.js +28 -7
  75. package/dist/SelectBase.js.map +1 -1
  76. package/dist/SelectBox.js +0 -1
  77. package/dist/SelectBox.js.map +1 -1
  78. package/dist/TextField.d.ts +1 -1
  79. package/dist/TextField.js.map +1 -1
  80. package/dist/assets/{InputSuggestions-GMbG8xQ2.js → InputSuggestions-i2kFpCfC.js} +1 -1
  81. package/dist/assets/{ListItemStandardExpandableTextTemplate-IyZB_qzJ.js → ListItemStandardExpandableTextTemplate-C1ceDaxu.js} +1 -1
  82. package/dist/assets/{bundle.esm-Dg7j0PXg.js → bundle.esm-DQ3cxywT.js} +216 -216
  83. package/dist/assets/messagebundle_en-DWAgV5VH.js +1 -0
  84. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  85. package/dist/css/themes/Dropdown.css +1 -1
  86. package/dist/css/themes/FilterMenu.css +1 -1
  87. package/dist/css/themes/ImageGridTicker.css +1 -1
  88. package/dist/css/themes/Link.css +1 -1
  89. package/dist/css/themes/ListGroupHeader.css +1 -1
  90. package/dist/css/themes/ListItem.css +1 -1
  91. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  92. package/dist/css/themes/MastheadItem.css +1 -1
  93. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  94. package/dist/css/themes/MastheadShell.css +1 -1
  95. package/dist/css/themes/Modal.css +1 -1
  96. package/dist/css/themes/RatingIndicator.css +1 -1
  97. package/dist/css/themes/ReviewItem.css +1 -1
  98. package/dist/css/themes/SecondaryNavigation.css +1 -1
  99. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  100. package/dist/css/themes/SecondaryNavigationSubItem.css +1 -1
  101. package/dist/css/themes/Slider.css +1 -1
  102. package/dist/custom-elements-internal.json +986 -19
  103. package/dist/custom-elements.json +734 -13
  104. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  105. package/dist/generated/i18n/i18n-defaults.d.ts +6 -1
  106. package/dist/generated/i18n/i18n-defaults.js +6 -1
  107. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  108. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +17 -10
  109. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  110. package/dist/generated/templates/ListItemTemplate.lit.js +32 -34
  111. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  112. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
  113. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  114. package/dist/generated/templates/MastheadItemTemplate.lit.js +33 -25
  115. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  116. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  117. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  118. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +5 -5
  119. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  120. package/dist/generated/templates/MastheadShellTemplate.lit.js +9 -10
  121. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  122. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +1 -1
  123. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  124. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  125. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  126. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  127. package/dist/generated/themes/Dropdown.css.d.ts +1 -1
  128. package/dist/generated/themes/Dropdown.css.js +1 -1
  129. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  130. package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
  131. package/dist/generated/themes/FilterMenu.css.js +1 -1
  132. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  133. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  134. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  135. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  136. package/dist/generated/themes/Link.css.d.ts +1 -1
  137. package/dist/generated/themes/Link.css.js +1 -1
  138. package/dist/generated/themes/Link.css.js.map +1 -1
  139. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  140. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  141. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  142. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  143. package/dist/generated/themes/ListItem.css.js +1 -1
  144. package/dist/generated/themes/ListItem.css.js.map +1 -1
  145. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  146. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  147. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  148. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  149. package/dist/generated/themes/MastheadItem.css.js +1 -1
  150. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  151. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  152. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  153. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  154. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  155. package/dist/generated/themes/MastheadShell.css.js +1 -1
  156. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  157. package/dist/generated/themes/Modal.css.d.ts +1 -1
  158. package/dist/generated/themes/Modal.css.js +1 -1
  159. package/dist/generated/themes/Modal.css.js.map +1 -1
  160. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  161. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  162. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  163. package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
  164. package/dist/generated/themes/ReviewItem.css.js +1 -1
  165. package/dist/generated/themes/ReviewItem.css.js.map +1 -1
  166. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  167. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  168. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  169. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  170. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  171. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  172. package/dist/generated/themes/SecondaryNavigationSubItem.css.d.ts +1 -1
  173. package/dist/generated/themes/SecondaryNavigationSubItem.css.js +1 -1
  174. package/dist/generated/themes/SecondaryNavigationSubItem.css.js.map +1 -1
  175. package/dist/generated/themes/Slider.css.d.ts +1 -1
  176. package/dist/generated/themes/Slider.css.js +1 -1
  177. package/dist/generated/themes/Slider.css.js.map +1 -1
  178. package/dist/messagebundle.properties +9 -0
  179. package/dist/messagebundle_en.properties +3 -0
  180. package/dist/types/List.d.ts +0 -2
  181. package/dist/types/List.js +0 -2
  182. package/dist/types/List.js.map +1 -1
  183. package/dist/types/SearchableListBase.d.ts +1 -0
  184. package/dist/types/SearchableListBase.js.map +1 -1
  185. package/dist/vscode.html-custom-data.json +144 -85
  186. package/dist/web-types.json +303 -83
  187. package/package.json +2 -1
  188. package/src/Avatar.ts +9 -0
  189. package/src/Breadcrumbs.ts +8 -20
  190. package/src/BreadcrumbsTemplate.tsx +1 -1
  191. package/src/FilterMenu.ts +4 -0
  192. package/src/ImageGridTickerTemplate.tsx +3 -1
  193. package/src/List.ts +51 -14
  194. package/src/ListGroupHeader.hbs +128 -17
  195. package/src/ListGroupHeader.ts +31 -1
  196. package/src/ListGroupHeaderBase.ts +1 -1
  197. package/src/ListItem.hbs +15 -2
  198. package/src/ListItem.ts +1 -1
  199. package/src/ListItemBase.ts +105 -7
  200. package/src/MastheadCountrySelector.hbs +6 -3
  201. package/src/MastheadCountrySelector.ts +31 -85
  202. package/src/MastheadItem.hbs +31 -23
  203. package/src/MastheadItem.ts +28 -18
  204. package/src/MastheadMenu.ts +10 -9
  205. package/src/MastheadMenuItem.hbs +1 -0
  206. package/src/MastheadMenuItem.ts +9 -0
  207. package/src/MastheadMobileMenu.hbs +5 -6
  208. package/src/MastheadMobileMenu.ts +34 -130
  209. package/src/MastheadProfileMenu.ts +1 -1
  210. package/src/MastheadShell.hbs +9 -11
  211. package/src/MastheadShell.ts +8 -50
  212. package/src/Pagination.ts +52 -8
  213. package/src/PromoTile.ts +10 -0
  214. package/src/PromoTileTemplate.tsx +4 -1
  215. package/src/ReviewItem.ts +45 -35
  216. package/src/ReviewItemTemplate.tsx +16 -14
  217. package/src/SearchableListBase.hbs +3 -0
  218. package/src/SearchableListBase.ts +52 -1
  219. package/src/SecondaryNavigationItem.ts +1 -2
  220. package/src/SelectBase.ts +33 -7
  221. package/src/SelectBox.ts +0 -1
  222. package/src/TextField.ts +1 -1
  223. package/src/generated/i18n/i18n-defaults.ts +2 -2
  224. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +17 -10
  225. package/src/generated/templates/ListItemTemplate.lit.ts +32 -34
  226. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
  227. package/src/generated/templates/MastheadItemTemplate.lit.ts +33 -25
  228. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  229. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +5 -5
  230. package/src/generated/templates/MastheadShellTemplate.lit.ts +9 -10
  231. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +1 -1
  232. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  233. package/src/generated/themes/Dropdown.css.ts +1 -1
  234. package/src/generated/themes/FilterMenu.css.ts +1 -1
  235. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  236. package/src/generated/themes/Link.css.ts +1 -1
  237. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  238. package/src/generated/themes/ListItem.css.ts +1 -1
  239. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  240. package/src/generated/themes/MastheadItem.css.ts +1 -1
  241. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  242. package/src/generated/themes/MastheadShell.css.ts +1 -1
  243. package/src/generated/themes/Modal.css.ts +1 -1
  244. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  245. package/src/generated/themes/ReviewItem.css.ts +1 -1
  246. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  247. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  248. package/src/generated/themes/SecondaryNavigationSubItem.css.ts +1 -1
  249. package/src/generated/themes/Slider.css.ts +1 -1
  250. package/src/i18n/messagebundle.properties +9 -0
  251. package/src/i18n/messagebundle_en.properties +3 -0
  252. package/src/themes/BreadcrumbsPopover.css +2 -0
  253. package/src/themes/Dropdown.css +5 -1
  254. package/src/themes/FilterMenu.css +2 -2
  255. package/src/themes/ImageGridTicker.css +2 -26
  256. package/src/themes/Link.css +2 -3
  257. package/src/themes/ListGroupHeader.css +102 -15
  258. package/src/themes/ListItem.css +67 -15
  259. package/src/themes/MastheadCountrySelector.css +3 -1
  260. package/src/themes/MastheadItem.css +88 -3
  261. package/src/themes/MastheadProfileMenu.css +1 -9
  262. package/src/themes/MastheadShell.css +0 -2
  263. package/src/themes/Modal.css +2 -1
  264. package/src/themes/ReviewItem.css +18 -1
  265. package/src/themes/SecondaryNavigation.css +6 -3
  266. package/src/themes/SecondaryNavigationItem.css +11 -10
  267. package/src/themes/SecondaryNavigationSubItem.css +3 -2
  268. package/src/types/List.ts +0 -2
  269. package/src/types/SearchableListBase.ts +1 -0
  270. package/dist/assets/messagebundle_en-DfoXjU7o.js +0 -1
@@ -38,7 +38,7 @@
38
38
  class="udex-masthead-mobile-menu__back-item"
39
39
  @click="{{handleBackToMenuItems}}"
40
40
  label="{{_clickedItem.innerText}}"
41
- aria-has-popup="true"
41
+ aria-haspopup="true"
42
42
  type="Button"
43
43
  is-back
44
44
  has-border
@@ -58,7 +58,7 @@
58
58
  @click="{{handleBackToCategories}}"
59
59
  label="{{_category.category}}"
60
60
  type="Button"
61
- aria-has-popup="true"
61
+ aria-haspopup="true"
62
62
  has-border
63
63
  icon-start
64
64
  is-back
@@ -75,9 +75,8 @@
75
75
  class="udex-masthead-mobile-menu__explore-btn"
76
76
  id="{{exploreItem._id}}"
77
77
  @click="{{handleExploreSapClick}}"
78
- @keydown="{{handleLeftRightKeys}}"
79
78
  accessible-role-text="button"
80
- aria-has-popup="true"
79
+ aria-haspopup="true"
81
80
  type="Button"
82
81
  first-level-btn
83
82
  first-level
@@ -96,7 +95,7 @@
96
95
  part="menu-item"
97
96
  @click="{{../handleMenuItemClick}}"
98
97
  label="{{this.innerText}}"
99
- aria-has-popup="true"
98
+ aria-haspopup="true"
100
99
  id="{{this._id}}"
101
100
  type="Button"
102
101
  first-level-btn
@@ -141,7 +140,7 @@
141
140
  @click="{{../handleMenuCategoryClick}}"
142
141
  id="{{@index}}"
143
142
  label="{{this.category}}"
144
- aria-has-popup="true"
143
+ aria-haspopup="true"
145
144
  type="Button"
146
145
  second-level-btn
147
146
  second-level
@@ -7,7 +7,7 @@ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
7
7
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
8
8
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
9
9
  import {
10
- isUp, isDown, isRight, isLeft, isHome, isEnd,
10
+ isHome, isEnd, isTabNext, isTabPrevious,
11
11
  } from "@ui5/webcomponents-base/dist/Keys.js";
12
12
  import type { MenuItem, SubMenuLinkItem } from "./MastheadItem.js";
13
13
  import type UDExMastheadItem from "./MastheadItem.js";
@@ -134,9 +134,6 @@ class UDExMastheadMobileMenu extends UI5Element {
134
134
  @property({ type: Boolean })
135
135
  _showCategoryItems!: boolean;
136
136
 
137
- @property({ type: String })
138
- _direction?: string;
139
-
140
137
  @i18n("@sapudex/web-components")
141
138
  static i18nBundle: I18nBundle;
142
139
 
@@ -202,63 +199,51 @@ class UDExMastheadMobileMenu extends UI5Element {
202
199
  }
203
200
 
204
201
  handlePressKey(e: KeyboardEvent) {
205
- this.handleUpArrow(e);
206
- this.handleDownArrow(e);
207
- this.handleLeftRightKeys(e);
208
- this.handleHomeKey(e);
209
- this.handleEndKey(e);
210
- }
202
+ const currentItem = e.target as UDExMastheadMenuItem;
203
+ const items = this.navigationItems;
204
+ const isFirstItem = currentItem === items[0];
205
+ const isLastItem = currentItem === items[items.length - 1];
211
206
 
212
- handleLeftRightKeys(e: KeyboardEvent) {
213
- this.handleRightArrow(e);
214
- this.handleLeftArrow(e);
215
- }
216
-
217
- handleRightArrow(e: KeyboardEvent) {
218
- if (isRight(e)) {
207
+ if (isTabNext(e) && !isLastItem) {
219
208
  e.preventDefault();
220
- this.handleDirection();
221
- if (this.isRtlDirection) {
222
- this.moveToBackWithKeyboard(e);
223
- } else {
224
- this.moveToNextLevelWithKeyboard(e);
225
- }
209
+ this.focusNextItem(currentItem);
226
210
  }
227
- }
228
-
229
- handleLeftArrow(e: KeyboardEvent) {
230
- if (isLeft(e)) {
211
+ if (isTabPrevious(e) && !isFirstItem) {
231
212
  e.preventDefault();
232
- this.handleDirection();
233
- if (this.isRtlDirection) {
234
- this.moveToNextLevelWithKeyboard(e);
235
- } else {
236
- this.moveToBackWithKeyboard(e);
237
- }
213
+ this.focusPreviousItem(currentItem);
238
214
  }
215
+ this.handleHomeKey(e);
216
+ this.handleEndKey(e);
239
217
  }
240
218
 
241
- handleUpArrow(e: KeyboardEvent) {
242
- if (isUp(e)) {
243
- e.preventDefault();
244
- this.focusPreviousItem(e);
245
- }
246
- }
219
+ focusNextItem(currentItem: UDExMastheadMenuItem): void {
220
+ const currentIndex = this.getCurrentIndex(currentItem);
221
+ const nextIndex = currentIndex + 1;
222
+ const currentListItem = this.getListItemByIndex(currentIndex);
223
+ let nextItem = this.getListItemByIndex(nextIndex);
247
224
 
248
- handleDownArrow(e: KeyboardEvent) {
249
- if (isDown(e)) {
250
- e.preventDefault();
251
- this.focusNextItem(e);
225
+ if (nextItem.type === UDExItemType.Heading) {
226
+ nextItem = this.getListItemByIndex(nextIndex + 1);
252
227
  }
228
+
229
+ currentListItem._tabIndex = "-1";
230
+ nextItem._tabIndex = "0";
231
+ nextItem.focus();
253
232
  }
254
233
 
255
- handleDirection() {
256
- const directionStyles: string = window.getComputedStyle(this).getPropertyValue("direction");
257
- if (!directionStyles) {
258
- this._direction = "ltr";
259
- } else {
260
- this._direction = directionStyles;
234
+ focusPreviousItem(currentItem: UDExMastheadMenuItem): void {
235
+ const currentIndex = this.getCurrentIndex(currentItem);
236
+ const previousIndex = currentIndex - 1;
237
+ const currentListItem = this.getListItemByIndex(currentIndex);
238
+ let prevItem = this.getListItemByIndex(previousIndex);
239
+
240
+ if (prevItem.type === UDExItemType.Heading) {
241
+ prevItem = this.getListItemByIndex(this.navigationItems.length - 1);
261
242
  }
243
+
244
+ currentListItem._tabIndex = "-1";
245
+ prevItem._tabIndex = "0";
246
+ prevItem.focus();
262
247
  }
263
248
 
264
249
  handleMobileItemEvent(e: PointerEvent) {
@@ -291,51 +276,6 @@ class UDExMastheadMobileMenu extends UI5Element {
291
276
  }
292
277
  }
293
278
 
294
- moveToBackWithKeyboard(e: KeyboardEvent) {
295
- const target = e.target as UDExMastheadMenuItem;
296
- if (target.hasAttribute("is-back-to-nav")) {
297
- this.showFirstLevelMenu();
298
- this.setFocusItemByIndex(this.items.indexOf(this._clickedItem));
299
- this.fireMobileItemEvent(e);
300
- }
301
-
302
- if (target.hasAttribute("is-back-to-categories")) {
303
- this.showCategories();
304
- this.setFocusItemByIndex(this._category.index);
305
- this.fireMobileItemEvent(e);
306
- }
307
-
308
- if (target.hasAttribute("is-explore-back")) {
309
- this.showFirstLevelMenu();
310
- this.setFocusExploreBtn();
311
- this._focusedItemIndex = 0;
312
- this.fireMobileItemEvent(e);
313
- }
314
- }
315
-
316
- moveToNextLevelWithKeyboard(e: KeyboardEvent) {
317
- const target = e.target as UDExMastheadItem;
318
- const item = this.getClickedItem(e.target as UDExMastheadItem);
319
-
320
- if (target.hasAttribute("is-explore")) {
321
- this._hideExploreSapBtn = true;
322
- this._showCategoryItems = false;
323
- this.fireMobileItemEvent(e);
324
- }
325
-
326
- if (target.hasAttribute("first-level-btn")) {
327
- this.openCategories(item);
328
- this.fireMobileItemEvent(e);
329
- }
330
-
331
- if (target.hasAttribute("second-level-btn")) {
332
- this.openCategoryItems(e);
333
- this.fireMobileItemEvent(e);
334
- }
335
-
336
- this.setFocusItemByIndex(0);
337
- }
338
-
339
279
  focusItemByIndex(index: number): void {
340
280
  this.getListItemByIndex(index)?.focus();
341
281
  this._shouldFocusItemByIndex = false;
@@ -346,38 +286,6 @@ class UDExMastheadMobileMenu extends UI5Element {
346
286
  this._shouldFocusExploreBtn = false;
347
287
  }
348
288
 
349
- focusPreviousItem(e: KeyboardEvent): void {
350
- const currentIndex = this.getCurrentIndex(e.target as UDExMastheadMenuItem);
351
- const lastIndex = this.navigationItems.length - 1;
352
- const previousIndex = currentIndex - 1 < 0 ? lastIndex : currentIndex - 1;
353
- const currentItem = this.getListItemByIndex(currentIndex);
354
- let prevItem = this.getListItemByIndex(previousIndex);
355
-
356
- if (prevItem.type === UDExItemType.Heading) {
357
- prevItem = this.getListItemByIndex(lastIndex);
358
- }
359
-
360
- currentItem._tabIndex = "-1";
361
- prevItem._tabIndex = "0";
362
- prevItem.focus();
363
- }
364
-
365
- focusNextItem(e: KeyboardEvent): void {
366
- const currentIndex = this.getCurrentIndex(e.target as UDExMastheadMenuItem);
367
- const navLength = this.navigationItems.length;
368
- const nextIndex = currentIndex + 1 > navLength - 1 ? 0 : currentIndex + 1;
369
- const currentItem = this.getListItemByIndex(currentIndex);
370
- let nextItem = this.getListItemByIndex(nextIndex);
371
-
372
- if (nextItem.type === UDExItemType.Heading) {
373
- nextItem = this.getListItemByIndex(nextIndex + 1);
374
- }
375
-
376
- currentItem._tabIndex = "-1";
377
- nextItem._tabIndex = "0";
378
- nextItem.focus();
379
- }
380
-
381
289
  handleEndKey(e: KeyboardEvent): void {
382
290
  if (isEnd(e)) {
383
291
  e.preventDefault();
@@ -572,10 +480,6 @@ class UDExMastheadMobileMenu extends UI5Element {
572
480
  return this.shadowRoot!.querySelector<UDExMastheadMenuItem>(".udex-masthead-mobile-menu__explore-btn")!;
573
481
  }
574
482
 
575
- get isRtlDirection(): boolean {
576
- return this._direction === "rtl";
577
- }
578
-
579
483
  get navigationItems(): Array<UDExMastheadMenuItem> {
580
484
  return Array.from(this.shadowRoot!.querySelectorAll<UDExMastheadMenuItem>("ul [udex-masthead-menu-item]"));
581
485
  }
@@ -418,7 +418,7 @@ class UDExMastheadProfileMenu extends UI5Element {
418
418
  }
419
419
 
420
420
  toggleScrollableClass(el: HTMLElement, className: string, scrollBottom: number): void {
421
- if (scrollBottom === 0) {
421
+ if (scrollBottom <= 1) {
422
422
  el.classList.remove(`${className}_scrollable`);
423
423
  } else {
424
424
  el.classList.add(`${className}_scrollable`);
@@ -53,17 +53,6 @@
53
53
  {{/if}}
54
54
 
55
55
  <div class="{{rightMenuClass}}">
56
- {{#if hasMobileMenuButtons}}
57
- <udex-masthead-item
58
- @ui5-item-click="{{handleOpenMobileMenu}}"
59
- class="udex-masthead-shell__menu-btn"
60
- accessible-role="button"
61
- icon="menu2"
62
- part="menu-open-btn"
63
- accessible-name="menu">
64
- <slot slot="dropdown" name="mobileMenu"></slot>
65
- </udex-masthead-item>
66
- {{/if}}
67
56
  {{#if hasExploreSAP}}
68
57
  <div
69
58
  class="udex-masthead-shell__explore"
@@ -124,6 +113,15 @@
124
113
  </div>
125
114
  {{/if}}
126
115
  {{#if hasMobileMenuButtons}}
116
+ <udex-masthead-item
117
+ @ui5-item-click="{{handleOpenMobileMenu}}"
118
+ class="udex-masthead-shell__menu-btn"
119
+ accessible-role="button"
120
+ icon="menu2"
121
+ part="menu-open-btn"
122
+ accessible-name="menu">
123
+ <slot slot="dropdown" name="mobileMenu"></slot>
124
+ </udex-masthead-item>
127
125
  <udex-masthead-item
128
126
  @keydown="{{handleEnterAndSpaceOnCloseBtn}}"
129
127
  @ui5-item-click="{{closeMobileMenu}}"
@@ -9,7 +9,7 @@ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
9
9
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
10
10
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
11
11
  import {
12
- isLeft, isRight, isSpace, isEnter, isEscape,
12
+ isSpace, isEnter, isEscape,
13
13
  } from "@ui5/webcomponents-base/dist/Keys.js";
14
14
  import "@ui5/webcomponents-icons/dist/decline.js";
15
15
  import "@ui5/webcomponents-icons/dist/menu2.js";
@@ -617,9 +617,16 @@ class UDExMastheadShell extends UI5Element {
617
617
  this.setProfileMobileMode();
618
618
  }
619
619
 
620
+ this.recalculateOpenDropdownPosition();
620
621
  this._shouldHandleResize = true;
621
622
  }
622
623
 
624
+ recalculateOpenDropdownPosition(): void {
625
+ this.getSelectedItems()
626
+ .filter(item => item.hasDropdownSlot && !item.isMobile && !item.isExploreBtn)
627
+ .forEach(item => item.recalculateDropdownPosition());
628
+ }
629
+
623
630
  handleMobileMode(): void {
624
631
  const rootHolder = this.getDomRef();
625
632
  if (rootHolder) {
@@ -641,8 +648,6 @@ class UDExMastheadShell extends UI5Element {
641
648
 
642
649
  handleKeyDown(e: KeyboardEvent): void {
643
650
  e.stopPropagation();
644
- this.handleLeftArrow(e);
645
- this.handleRightArrow(e);
646
651
  }
647
652
 
648
653
  handleSearchKeyDown(e: CustomEvent): void {
@@ -658,30 +663,6 @@ class UDExMastheadShell extends UI5Element {
658
663
  }
659
664
  }
660
665
 
661
- handleLeftArrow(e: KeyboardEvent): void {
662
- if (isLeft(e)) {
663
- const currentItem = e.target as UDExMastheadItem;
664
- if (this.isNavigationItem(currentItem)) {
665
- if (currentItem.selected) {
666
- currentItem.closeDropdown();
667
- }
668
- this.focusPreviousMenuItem(currentItem);
669
- }
670
- }
671
- }
672
-
673
- handleRightArrow(e: KeyboardEvent): void {
674
- if (isRight(e)) {
675
- const currentItem = e.target as UDExMastheadItem;
676
- if (this.isNavigationItem(currentItem)) {
677
- if (currentItem.selected) {
678
- currentItem.closeDropdown();
679
- }
680
- this.focusNextMenuItem(currentItem);
681
- }
682
- }
683
- }
684
-
685
666
  handleLogoClick(e: PointerEvent): void {
686
667
  this.fireMastheadEvent("logo-click", e);
687
668
  }
@@ -765,21 +746,6 @@ class UDExMastheadShell extends UI5Element {
765
746
  input?.focus();
766
747
  }
767
748
 
768
- focusPreviousMenuItem(item: UDExMastheadItem): void {
769
- const menuItems = this.menuItems;
770
- const lastItemIndex = menuItems.length - 1;
771
- const currentSelectedIndex = this.getCurrentIndex(item);
772
- const previousSelectIndex = currentSelectedIndex - 1 < 0 ? lastItemIndex : currentSelectedIndex - 1;
773
- menuItems[previousSelectIndex].focus();
774
- }
775
-
776
- focusNextMenuItem(item: UDExMastheadItem): void {
777
- const menuItems = this.menuItems;
778
- const currentSelectedIndex = this.getCurrentIndex(item);
779
- const nextSelectIndex = currentSelectedIndex + 1 > menuItems.length - 1 ? 0 : currentSelectedIndex + 1;
780
- menuItems[nextSelectIndex].focus();
781
- }
782
-
783
749
  resetSelectedItems(clickedId?: string): void {
784
750
  this.getSelectedItems().forEach(item => {
785
751
  if (item._id !== clickedId && item.selected) {
@@ -811,10 +777,6 @@ class UDExMastheadShell extends UI5Element {
811
777
  }
812
778
  }
813
779
 
814
- getCurrentIndex(item: UDExMastheadItem): number {
815
- return this.menuItems.indexOf(item);
816
- }
817
-
818
780
  getSelectedItems(): Array<UDExMastheadItem> {
819
781
  const buttonsArray: Array<UDExMastheadItem> = [
820
782
  ...this.menuItems,
@@ -920,10 +882,6 @@ class UDExMastheadShell extends UI5Element {
920
882
  return window.getComputedStyle(this.getDomRef()!).getPropertyValue(`${variableName}`);
921
883
  }
922
884
 
923
- isNavigationItem(item: UDExMastheadItem): boolean {
924
- return this.menuItems.some(menuItem => menuItem === item);
925
- }
926
-
927
885
  setOverflowBody() {
928
886
  const { body: { style } } = document;
929
887
  this._shouldHandleResize = false;
package/src/Pagination.ts CHANGED
@@ -40,7 +40,8 @@ export enum UDExPaginationType {
40
40
 
41
41
  export enum UDExDisplayType {
42
42
  desktop = "desktop",
43
- mobile = "mobile"
43
+ mobile = "mobile",
44
+ auto = "auto"
44
45
  }
45
46
 
46
47
  type UDExPaginationChangeEventDetail = {
@@ -121,6 +122,14 @@ class UDExPagination extends UI5Element {
121
122
  @property({ type: String })
122
123
  _direction?: string;
123
124
 
125
+ /**
126
+ * Tracks the resolved display mode for auto display.
127
+ *
128
+ * @private
129
+ */
130
+ @property({ noAttribute: true })
131
+ _effectiveDisplay?: `${UDExDisplayType}`;
132
+
124
133
  /**
125
134
  * Defines if the previous button is in pseudo-disabled.
126
135
  *
@@ -140,6 +149,8 @@ class UDExPagination extends UI5Element {
140
149
  @i18n("@sapudex/web-components")
141
150
  static i18nBundle: I18nBundle;
142
151
 
152
+ static readonly AUTO_DISPLAY_BREAKPOINT = 980;
153
+
143
154
  _pages: Page[];
144
155
  _visiblePages: Page[];
145
156
 
@@ -150,6 +161,7 @@ class UDExPagination extends UI5Element {
150
161
  _firstPageIndex!: number;
151
162
  _lastPageIndex!: number;
152
163
  _pageFocusedManually!: boolean;
164
+ _resizeHandler!: () => void;
153
165
 
154
166
  constructor() {
155
167
  super();
@@ -160,12 +172,44 @@ class UDExPagination extends UI5Element {
160
172
  this._mobileDisplayNumber = 5;
161
173
  this._desktopDisplayNumber = 10;
162
174
  this._pageFocusedManually = false;
175
+ this._resizeHandler = this._handleResize.bind(this);
163
176
  }
164
177
 
165
178
  onEnterDOM() {
166
179
  if (isDesktop()) {
167
180
  this.setAttribute("desktop", "");
168
181
  }
182
+ if (this.display === UDExDisplayType.auto) {
183
+ this._effectiveDisplay = this._displayType;
184
+ window.addEventListener("resize", this._resizeHandler);
185
+ }
186
+ }
187
+
188
+ onExitDOM() {
189
+ window.removeEventListener("resize", this._resizeHandler);
190
+ }
191
+
192
+ _handleResize(): void {
193
+ if (this.display === UDExDisplayType.auto) {
194
+ const newDisplay = this._displayType;
195
+ if (this._effectiveDisplay !== newDisplay) {
196
+ this._effectiveDisplay = newDisplay;
197
+ this._pages = [];
198
+ }
199
+ }
200
+ }
201
+
202
+ get _displayType(): `${UDExDisplayType}` {
203
+ return window.innerWidth > UDExPagination.AUTO_DISPLAY_BREAKPOINT
204
+ ? UDExDisplayType.desktop
205
+ : UDExDisplayType.mobile;
206
+ }
207
+
208
+ get effectiveDisplay(): `${UDExDisplayType}` {
209
+ if (this.display === UDExDisplayType.auto) {
210
+ return this._effectiveDisplay ?? (this._displayType);
211
+ }
212
+ return this.display;
169
213
  }
170
214
 
171
215
  onBeforeRendering(): void {
@@ -182,13 +226,13 @@ class UDExPagination extends UI5Element {
182
226
 
183
227
  get typeFull(): boolean {
184
228
  return (
185
- this.type === UDExPaginationType.full || this.display === UDExDisplayType.mobile
229
+ this.type === UDExPaginationType.full || this.effectiveDisplay === UDExDisplayType.mobile
186
230
  );
187
231
  }
188
232
 
189
233
  get typeShort(): boolean {
190
234
  return (
191
- this.type === UDExPaginationType.short && this.display !== UDExDisplayType.mobile
235
+ this.type === UDExPaginationType.short && this.effectiveDisplay !== UDExDisplayType.mobile
192
236
  );
193
237
  }
194
238
 
@@ -265,19 +309,19 @@ class UDExPagination extends UI5Element {
265
309
  if (this._direction === "rtl") {
266
310
  classes = `${classes} udex-pagination--${this._direction}`;
267
311
  }
268
- if (!this.display) {
312
+ if (!this.effectiveDisplay) {
269
313
  return classes;
270
314
  }
271
- return `${classes} udex-pagination--${this.display} udex-pagination--${this.type}`;
315
+ return `${classes} udex-pagination--${this.effectiveDisplay} udex-pagination--${this.type}`;
272
316
  }
273
317
 
274
318
  get displayNumber(): number {
275
- const lastIndex = this.display === UDExDisplayType.mobile ? this._mobileDisplayNumber : this._desktopDisplayNumber;
319
+ const lastIndex = this.effectiveDisplay === UDExDisplayType.mobile ? this._mobileDisplayNumber : this._desktopDisplayNumber;
276
320
  return lastIndex;
277
321
  }
278
322
 
279
323
  get pageOffset(): number {
280
- if (this.display === UDExDisplayType.mobile) {
324
+ if (this.effectiveDisplay === UDExDisplayType.mobile) {
281
325
  return Math.floor(this._mobileDisplayNumber / 2);
282
326
  }
283
327
  return this._desktopDisplayNumber / 2 - 1;
@@ -364,7 +408,7 @@ class UDExPagination extends UI5Element {
364
408
  return;
365
409
  }
366
410
 
367
- if (!this._pages.length || this._visiblePages.length < this.displayNumber) {
411
+ if (!this._pages.length || this._visiblePages.length !== this.displayNumber) {
368
412
  this._firstPageIndex = 0;
369
413
  this._lastPageIndex = pages > this.displayNumber ? this.displayNumber : pages;
370
414
  this._pageFocusedManually = false;
package/src/PromoTile.ts CHANGED
@@ -81,6 +81,15 @@ class UDExPromoTile extends UI5Element {
81
81
  @slot({ type: HTMLElement })
82
82
  pictogram?: Array<HTMLElement>;
83
83
 
84
+ /**
85
+ * Allows control over setting the CSS gradient.
86
+ *
87
+ * @default undefined
88
+ * @public
89
+ */
90
+ @property({ type: String })
91
+ backgroundGradient?: string;
92
+
84
93
  /**
85
94
  * Defines the orientation of the Promo Tile component.
86
95
  *
@@ -179,6 +188,7 @@ class UDExPromoTile extends UI5Element {
179
188
  _colorMode: UDExPromoTileMode = UDExPromoTileMode.light;
180
189
  _lightModeColors: Array<number> = [1, 2];
181
190
  _darkModeColors: Array<number> = [7, 8, 9, 10];
191
+ _defaultBackgroundColor = "#FFF";
182
192
 
183
193
  constructor() {
184
194
  super();
@@ -12,7 +12,10 @@ export default function PromoTileTemplate(this: UDExPromoTile) {
12
12
  <div
13
13
  role="region"
14
14
  class={`${rootClass}__container ${rootClass}--${this.orientation?.toLowerCase()} ${rootClass}--${this._colorMode}`}
15
- aria-label={this.promoTileContainerText}>
15
+ aria-label={this.promoTileContainerText}
16
+ style={this.backgroundGradient
17
+ ? { backgroundImage: this.backgroundGradient, backgroundColor: this._defaultBackgroundColor }
18
+ : undefined}>
16
19
  {this._showPictogram &&
17
20
  <div
18
21
  part="image"