@sapudex/web-components 0.138.0 → 0.143.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 (198) hide show
  1. package/dist/Accordion.js +1 -1
  2. package/dist/Accordion.js.map +1 -1
  3. package/dist/Avatar.js +1 -1
  4. package/dist/Avatar.js.map +1 -1
  5. package/dist/Breadcrumbs.js +1 -1
  6. package/dist/Breadcrumbs.js.map +1 -1
  7. package/dist/Carousel.js +1 -1
  8. package/dist/Carousel.js.map +1 -1
  9. package/dist/CountrySelector.js +7 -3
  10. package/dist/CountrySelector.js.map +1 -1
  11. package/dist/DatePicker.js +1 -1
  12. package/dist/DatePicker.js.map +1 -1
  13. package/dist/Dropdown.d.ts +1 -0
  14. package/dist/Dropdown.js +13 -1
  15. package/dist/Dropdown.js.map +1 -1
  16. package/dist/FilterMenu.d.ts +2 -1
  17. package/dist/FilterMenu.js +13 -5
  18. package/dist/FilterMenu.js.map +1 -1
  19. package/dist/Footer.js +1 -1
  20. package/dist/Footer.js.map +1 -1
  21. package/dist/InputGroup.js +1 -1
  22. package/dist/InputGroup.js.map +1 -1
  23. package/dist/List.js +1 -1
  24. package/dist/List.js.map +1 -1
  25. package/dist/ListItem.js +1 -1
  26. package/dist/ListItem.js.map +1 -1
  27. package/dist/ListItemBase.d.ts +2 -2
  28. package/dist/ListItemBase.js.map +1 -1
  29. package/dist/ListSelectAll.js +1 -1
  30. package/dist/ListSelectAll.js.map +1 -1
  31. package/dist/MastheadItem.js +3 -8
  32. package/dist/MastheadItem.js.map +1 -1
  33. package/dist/MastheadMobileMenu.js +1 -1
  34. package/dist/MastheadMobileMenu.js.map +1 -1
  35. package/dist/MastheadProfileMenu.js +1 -1
  36. package/dist/MastheadProfileMenu.js.map +1 -1
  37. package/dist/MastheadShell.d.ts +22 -6
  38. package/dist/MastheadShell.js +39 -25
  39. package/dist/MastheadShell.js.map +1 -1
  40. package/dist/MessageStrip.js +1 -1
  41. package/dist/MessageStrip.js.map +1 -1
  42. package/dist/Pagination.js +1 -1
  43. package/dist/Pagination.js.map +1 -1
  44. package/dist/PasswordField.js +1 -1
  45. package/dist/PasswordField.js.map +1 -1
  46. package/dist/PhoneNumberField.js +1 -1
  47. package/dist/PhoneNumberField.js.map +1 -1
  48. package/dist/RatingBar.js +1 -1
  49. package/dist/RatingBar.js.map +1 -1
  50. package/dist/Review.js +1 -1
  51. package/dist/Review.js.map +1 -1
  52. package/dist/ReviewItem.js +1 -1
  53. package/dist/ReviewItem.js.map +1 -1
  54. package/dist/Search.js +1 -1
  55. package/dist/Search.js.map +1 -1
  56. package/dist/SearchableListBase.d.ts +5 -0
  57. package/dist/SearchableListBase.js +11 -4
  58. package/dist/SearchableListBase.js.map +1 -1
  59. package/dist/SecondaryNavigation.d.ts +1 -0
  60. package/dist/SecondaryNavigation.js +8 -2
  61. package/dist/SecondaryNavigation.js.map +1 -1
  62. package/dist/SecondaryNavigationItem.d.ts +8 -0
  63. package/dist/SecondaryNavigationItem.js +19 -0
  64. package/dist/SecondaryNavigationItem.js.map +1 -1
  65. package/dist/SecondaryNavigationSubItem.js +1 -1
  66. package/dist/SecondaryNavigationSubItem.js.map +1 -1
  67. package/dist/SelectBox.js +1 -1
  68. package/dist/SelectBox.js.map +1 -1
  69. package/dist/StatusBadge.js +1 -1
  70. package/dist/StatusBadge.js.map +1 -1
  71. package/dist/StepInput.js +1 -1
  72. package/dist/StepInput.js.map +1 -1
  73. package/dist/Tab.js +1 -1
  74. package/dist/Tab.js.map +1 -1
  75. package/dist/TabNavigation.js +1 -1
  76. package/dist/TabNavigation.js.map +1 -1
  77. package/dist/Table.js +1 -1
  78. package/dist/Table.js.map +1 -1
  79. package/dist/TextArea.js +1 -1
  80. package/dist/TextArea.js.map +1 -1
  81. package/dist/TextField.js +1 -2
  82. package/dist/TextField.js.map +1 -1
  83. package/dist/TruncatedText.js +1 -1
  84. package/dist/TruncatedText.js.map +1 -1
  85. package/dist/assets/{bundle.esm-bb1c7413.js → bundle.esm-8623b7b1.js} +187 -187
  86. package/dist/css/themes/Button.css +1 -1
  87. package/dist/css/themes/CountrySelector.css +1 -1
  88. package/dist/css/themes/Dropdown.css +1 -1
  89. package/dist/css/themes/FilterMenu.css +1 -1
  90. package/dist/css/themes/MastheadItem.css +1 -1
  91. package/dist/css/themes/MastheadShell.css +1 -1
  92. package/dist/css/themes/PhoneNumberField.css +1 -1
  93. package/dist/css/themes/RatingIndicator.css +1 -1
  94. package/dist/css/themes/Search.css +1 -1
  95. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  96. package/dist/css/themes/SelectBox.css +1 -1
  97. package/dist/css/themes/Slider.css +1 -1
  98. package/dist/custom-elements-internal.json +56 -0
  99. package/dist/custom-elements.json +55 -0
  100. package/dist/data/CountryListISO3166.js +1 -1
  101. package/dist/data/CountryListISO3166.js.map +1 -1
  102. package/dist/generated/templates/MastheadShellTemplate.lit.js +10 -8
  103. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  104. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +2 -2
  105. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  106. package/dist/generated/themes/Button.css.js +1 -1
  107. package/dist/generated/themes/Button.css.js.map +1 -1
  108. package/dist/generated/themes/CountrySelector.css.js +1 -1
  109. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  110. package/dist/generated/themes/Dropdown.css.js +1 -1
  111. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  112. package/dist/generated/themes/FilterMenu.css.js +1 -1
  113. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  114. package/dist/generated/themes/MastheadItem.css.js +1 -1
  115. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  116. package/dist/generated/themes/MastheadShell.css.js +1 -1
  117. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  118. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  119. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  120. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  121. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  122. package/dist/generated/themes/Search.css.js +1 -1
  123. package/dist/generated/themes/Search.css.js.map +1 -1
  124. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  125. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  126. package/dist/generated/themes/SelectBox.css.js +1 -1
  127. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  128. package/dist/generated/themes/Slider.css.js +1 -1
  129. package/dist/generated/themes/Slider.css.js.map +1 -1
  130. package/dist/vscode.html-custom-data.json +9 -4
  131. package/dist/web-types.json +14 -4
  132. package/package.json +1 -1
  133. package/src/Accordion.ts +1 -1
  134. package/src/Avatar.ts +1 -1
  135. package/src/Breadcrumbs.ts +1 -1
  136. package/src/Carousel.ts +1 -1
  137. package/src/CountrySelector.ts +8 -4
  138. package/src/DatePicker.ts +1 -1
  139. package/src/Dropdown.ts +9 -1
  140. package/src/FilterMenu.ts +12 -7
  141. package/src/Footer.ts +1 -1
  142. package/src/InputGroup.ts +1 -1
  143. package/src/List.ts +1 -1
  144. package/src/ListItem.ts +1 -1
  145. package/src/ListItemBase.ts +1 -1
  146. package/src/ListSelectAll.ts +1 -1
  147. package/src/MastheadItem.ts +5 -10
  148. package/src/MastheadMobileMenu.ts +1 -1
  149. package/src/MastheadProfileMenu.ts +1 -1
  150. package/src/MastheadShell.hbs +26 -19
  151. package/src/MastheadShell.ts +57 -29
  152. package/src/MessageStrip.ts +1 -3
  153. package/src/Pagination.ts +1 -1
  154. package/src/PasswordField.ts +1 -1
  155. package/src/PhoneNumberField.ts +1 -1
  156. package/src/RatingBar.ts +1 -1
  157. package/src/Review.ts +1 -1
  158. package/src/ReviewItem.ts +1 -1
  159. package/src/Search.ts +1 -1
  160. package/src/SearchableListBase.ts +15 -7
  161. package/src/SecondaryNavigation.hbs +2 -0
  162. package/src/SecondaryNavigation.ts +9 -2
  163. package/src/SecondaryNavigationItem.ts +29 -0
  164. package/src/SecondaryNavigationSubItem.ts +1 -1
  165. package/src/SelectBox.ts +1 -1
  166. package/src/StatusBadge.ts +1 -1
  167. package/src/StepInput.ts +1 -1
  168. package/src/Tab.ts +1 -1
  169. package/src/TabNavigation.ts +1 -1
  170. package/src/Table.ts +1 -1
  171. package/src/TextArea.ts +1 -1
  172. package/src/TextField.ts +1 -2
  173. package/src/TruncatedText.ts +1 -1
  174. package/src/data/CountryListISO3166.ts +1 -1
  175. package/src/generated/templates/MastheadShellTemplate.lit.ts +10 -8
  176. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +2 -2
  177. package/src/generated/themes/Button.css.ts +1 -1
  178. package/src/generated/themes/CountrySelector.css.ts +1 -1
  179. package/src/generated/themes/Dropdown.css.ts +1 -1
  180. package/src/generated/themes/FilterMenu.css.ts +1 -1
  181. package/src/generated/themes/MastheadItem.css.ts +1 -1
  182. package/src/generated/themes/MastheadShell.css.ts +1 -1
  183. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  184. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  185. package/src/generated/themes/Search.css.ts +1 -1
  186. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  187. package/src/generated/themes/SelectBox.css.ts +1 -1
  188. package/src/generated/themes/Slider.css.ts +1 -1
  189. package/src/themes/Button.css +10 -0
  190. package/src/themes/CountrySelector.css +13 -11
  191. package/src/themes/Dropdown.css +10 -0
  192. package/src/themes/FilterMenu.css +15 -2
  193. package/src/themes/MastheadItem.css +6 -2
  194. package/src/themes/MastheadShell.css +88 -9
  195. package/src/themes/PhoneNumberField.css +22 -20
  196. package/src/themes/Search.css +4 -0
  197. package/src/themes/SecondaryNavigationItem.css +8 -1
  198. package/src/themes/SelectBox.css +8 -0
package/src/FilterMenu.ts CHANGED
@@ -295,13 +295,7 @@ class UDExFilterMenu extends UDExSearchableListBase {
295
295
  _search!: UDExSearch;
296
296
  _hasFooterButtons!: boolean;
297
297
  _popover!: ResponsivePopover;
298
-
299
- onAfterRendering() {
300
- this._search = this.getSearch();
301
- this._popover = this.getPopover();
302
- this._trigger = this.getTriggerButton();
303
- this._hasFooterButtons = this.hasFooterButtons;
304
- }
298
+ _breakpointSizeXS = 640;
305
299
 
306
300
  onEnterDOM(): void {
307
301
  if (isDesktop()) {
@@ -313,6 +307,13 @@ class UDExFilterMenu extends UDExSearchableListBase {
313
307
  super.onBeforeRendering();
314
308
  }
315
309
 
310
+ onAfterRendering() {
311
+ this._search = this.getSearch();
312
+ this._popover = this.getPopover();
313
+ this._trigger = this.getTriggerButton();
314
+ this._hasFooterButtons = this.hasFooterButtons;
315
+ }
316
+
316
317
  handleSelectAll(e:CustomEvent): void {
317
318
  this.onFilterSelectAllHeaderPress(e);
318
319
  this.fireEvent("select-all");
@@ -436,6 +437,10 @@ class UDExFilterMenu extends UDExSearchableListBase {
436
437
  }
437
438
 
438
439
  _dropdownAfterOpen(): void {
440
+ const popoverLeftOffset = +this._popover.style.left.split("px")[0];
441
+ if (this._popover.offsetWidth + popoverLeftOffset < this._breakpointSizeXS) {
442
+ this.style.setProperty("--udex-filter-menu-popover-left-offset", `${this._popover.style.left}`);
443
+ }
439
444
  this.fireEvent("after-open");
440
445
  }
441
446
 
package/src/Footer.ts CHANGED
@@ -320,7 +320,7 @@ class UDExFooter extends UI5Element {
320
320
  static i18nBundle: I18nBundle;
321
321
 
322
322
  static async onDefine(): Promise<void> {
323
- UDExFooter.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
323
+ UDExFooter.i18nBundle = await getI18nBundle("@udex/web-components");
324
324
  }
325
325
 
326
326
  _handleResizeBound: ResizeObserverCallback;
package/src/InputGroup.ts CHANGED
@@ -104,7 +104,7 @@ class UDExInputGroup extends UI5Element {
104
104
  static i18nBundle: I18nBundle;
105
105
 
106
106
  static async onDefine() {
107
- UDExInputGroup.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
107
+ UDExInputGroup.i18nBundle = await getI18nBundle("@udex/web-components");
108
108
  }
109
109
 
110
110
  get _items() {
package/src/List.ts CHANGED
@@ -147,7 +147,7 @@ class UDExList extends UI5Element {
147
147
  static i18nBundle: I18nBundle;
148
148
 
149
149
  static async onDefine(): Promise<void> {
150
- UDExList.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
150
+ UDExList.i18nBundle = await getI18nBundle("@udex/web-components");
151
151
  }
152
152
 
153
153
  onBeforeRendering(): void {
package/src/ListItem.ts CHANGED
@@ -251,7 +251,7 @@ class UDExListItem extends UDExListItemBase {
251
251
  }
252
252
 
253
253
  static async onDefine(): Promise<void> {
254
- UDExListItem.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
254
+ UDExListItem.i18nBundle = await getI18nBundle("@udex/web-components");
255
255
  }
256
256
 
257
257
  onEnterDOM() {
@@ -112,7 +112,7 @@ class UDExListItemBase extends UI5Element {
112
112
  _icon?: string;
113
113
 
114
114
  @property({ type: String })
115
- _tabIndex!: number | string;
115
+ _tabIndex!: string;
116
116
 
117
117
  get _effectiveTabIndex() {
118
118
  if (this.disabled) {
@@ -46,7 +46,7 @@ class UDExListSelectAll extends UDExListGroupHeaderBase {
46
46
  static i18nBundle: I18nBundle;
47
47
 
48
48
  static async onDefine(): Promise<void> {
49
- UDExListSelectAll.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
49
+ UDExListSelectAll.i18nBundle = await getI18nBundle("@udex/web-components");
50
50
  }
51
51
 
52
52
  handleSelectAllPress() {
@@ -226,7 +226,7 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
226
226
  static i18nBundle: I18nBundle;
227
227
 
228
228
  static async onDefine(): Promise<void> {
229
- UDExMastheadItem.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
229
+ UDExMastheadItem.i18nBundle = await getI18nBundle("@udex/web-components");
230
230
  }
231
231
 
232
232
  onEnterDOM() {
@@ -262,16 +262,11 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
262
262
  }
263
263
  }
264
264
 
265
- handleKeyEscapeMobile() {
266
- const mastheadShell: MastheadShell | null = document.querySelector("udex-masthead-shell");
267
- const mobileMenu = mastheadShell?.mastheadMobileMenu;
268
- mastheadShell?.removeActiveMobileClass();
269
- mastheadShell?.mobileBtn?.focus();
270
- this.selected = false;
265
+ handleKeyEscapeMobile(): void {
266
+ const mastheadShell: MastheadShell = document.querySelector<MastheadShell>("udex-masthead-shell")!;
271
267
 
272
- if (mobileMenu) {
273
- mobileMenu.showFirstLevelMenu();
274
- }
268
+ mastheadShell.closeMobileMenu();
269
+ mastheadShell.mobileBtn?.focus();
275
270
  }
276
271
 
277
272
  handleNavigationItemClick(e: Event): void {
@@ -122,7 +122,7 @@ class UDExMastheadMobileMenu extends UI5Element {
122
122
  static i18nBundle: I18nBundle;
123
123
 
124
124
  static async onDefine(): Promise<void> {
125
- UDExMastheadMobileMenu.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
125
+ UDExMastheadMobileMenu.i18nBundle = await getI18nBundle("@udex/web-components");
126
126
  }
127
127
 
128
128
  onAfterRendering() {
@@ -122,7 +122,7 @@ class UDExMastheadProfileMenu extends UI5Element {
122
122
  static i18nBundle: I18nBundle;
123
123
 
124
124
  static async onDefine(): Promise<void> {
125
- UDExMastheadProfileMenu.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
125
+ UDExMastheadProfileMenu.i18nBundle = await getI18nBundle("@udex/web-components");
126
126
  }
127
127
 
128
128
  handleUserLogoutItemClick(e: Event): void {
@@ -8,7 +8,7 @@
8
8
  {{>siteLabel}}
9
9
  {{/if}}
10
10
 
11
- {{#unless _isSearchVisible}}
11
+ {{#if isMainMenuVisible}}
12
12
  <div
13
13
  class="udex-masthead-shell__main-menu"
14
14
  data-menubar-item-expanded="true"
@@ -17,29 +17,35 @@
17
17
  {{>item}}
18
18
  {{/each}}
19
19
  </div>
20
- {{/unless}}
20
+ {{/if}}
21
21
  </div>
22
22
 
23
- {{#if _isSearchVisible}}
23
+ {{#if isSearchVisible}}
24
24
  <div class="udex-masthead-shell__search-container">
25
25
  <slot name="search"></slot>
26
26
  </div>
27
- <div class="udex-masthead-shell__btn-holder">
28
- <udex-control-button
29
- class="udex-masthead-shell__close-search-btn"
30
- size="Small"
31
- icon="decline"
32
- accessible-name="{{closeButtonAccessibleName}}"
33
- @click={{hideSearch}}>
34
- </udex-control-button>
35
- </div>
36
- {{else}}
37
- <div class="udex-masthead-shell__right-menu">
38
- <div
39
- class="udex-masthead-shell__explore"
40
- @ui5-item-click="{{setSelectedItem}}">
41
- <slot name="exploreSAP"></slot>
27
+ {{#if _isSearchOpened}}
28
+ <div class="udex-masthead-shell__btn-holder">
29
+ <udex-control-button
30
+ class="udex-masthead-shell__close-search-btn"
31
+ size="Small"
32
+ icon="decline"
33
+ accessible-name="{{closeButtonAccessibleName}}"
34
+ @click={{hideSearch}}>
35
+ </udex-control-button>
42
36
  </div>
37
+ {{/if}}
38
+ {{/if}}
39
+
40
+ {{#if isRightMenuVisible}}
41
+ <div class="udex-masthead-shell__right-menu">
42
+ {{#if hasExploreSAP}}
43
+ <div
44
+ class="udex-masthead-shell__explore"
45
+ @ui5-item-click="{{setSelectedItem}}">
46
+ <slot name="exploreSAP"></slot>
47
+ </div>
48
+ {{/if}}
43
49
  {{#if hasSearch}}
44
50
  <div class="udex-masthead-shell__search-icon">
45
51
  <udex-masthead-item
@@ -77,6 +83,7 @@
77
83
  <slot slot="dropdown" name="mobileMenu"></slot>
78
84
  </udex-masthead-item>
79
85
  <udex-masthead-item
86
+ @keydown="{{handleEnterAndSpaceOnCloseBtn}}"
80
87
  @ui5-item-click="{{handleMobileCloseClick}}"
81
88
  class="udex-masthead-shell__close-btn"
82
89
  accessible-role="button"
@@ -124,7 +131,7 @@
124
131
  {{/inline}}
125
132
 
126
133
  {{#*inline "siteLabel"}}
127
- {{#if homeUrl}}
134
+ {{#if siteLabelUrl}}
128
135
  <a
129
136
  @click="{{handleSiteLabelClick}}"
130
137
  role="link"
@@ -6,7 +6,9 @@ import event from "@ui5/webcomponents-base/dist/decorators/event.js";
6
6
  import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
7
7
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
8
  import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
- import { isLeft, isRight } from "@ui5/webcomponents-base/dist/Keys.js";
9
+ import {
10
+ isLeft, isRight, isSpace, isEnter,
11
+ } from "@ui5/webcomponents-base/dist/Keys.js";
10
12
  import "@ui5/webcomponents-icons/dist/decline.js";
11
13
  import "@ui5/webcomponents-icons/dist/menu2.js";
12
14
  import "@ui5/webcomponents-icons/dist/search.js";
@@ -22,9 +24,7 @@ import MastheadShellTemplate from "./generated/templates/MastheadShellTemplate.l
22
24
  // Styles
23
25
  import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
24
26
 
25
- const mobileMenuActiveClass: string = "udex-masthead-shell_mobile-menu-open";
26
27
  const breakpointSizeM: number = 1279;
27
-
28
28
  /**
29
29
  * @class
30
30
  *
@@ -181,6 +181,15 @@ class UDExMastheadShell extends UI5Element {
181
181
  @property({ type: Boolean })
182
182
  bodyOverflow!: boolean;
183
183
 
184
+ /**
185
+ * Defines the visibility of the Search by default.
186
+ *
187
+ * @default ""
188
+ * @public
189
+ */
190
+ @property({ type: Boolean })
191
+ showSearchByDefault!: boolean;
192
+
184
193
  /**
185
194
  * Defines sticky position for component
186
195
  *
@@ -251,12 +260,20 @@ class UDExMastheadShell extends UI5Element {
251
260
  siteLabelAriaLabel!: string;
252
261
 
253
262
  /**
254
- * Defines if the search container is visible
263
+ * Defines if the search container is opened
255
264
  *
256
265
  * @private
257
266
  */
258
267
  @property({ type: Boolean })
259
- _isSearchVisible!: boolean;
268
+ _isSearchOpened!: boolean;
269
+
270
+ /**
271
+ * Defines if the mobile menu is open
272
+ *
273
+ * @private
274
+ */
275
+ @property({ type: Boolean })
276
+ _isMobileMenuOpen!: boolean;
260
277
 
261
278
  /**
262
279
  * Defines if the close button was clicked
@@ -284,7 +301,7 @@ class UDExMastheadShell extends UI5Element {
284
301
 
285
302
  this.handleOutsideClick();
286
303
 
287
- if (this._isSearchVisible) {
304
+ if (this._isSearchOpened) {
288
305
  this.focusSearchInput();
289
306
  }
290
307
 
@@ -302,12 +319,12 @@ class UDExMastheadShell extends UI5Element {
302
319
  }
303
320
 
304
321
  _handleResize(): void {
305
- if (this.isMobileView) {
306
- this._isSearchVisible = false;
322
+ if (this.isBreakpointSizeM) {
323
+ this._isSearchOpened = false;
307
324
  }
308
325
 
309
- if (this._shouldHandleResize && this.isMobileView) {
310
- this.resetMobileMenuOpenState();
326
+ if (this._shouldHandleResize && this.isBreakpointSizeM) {
327
+ this.closeMobileMenu();
311
328
  return;
312
329
  }
313
330
 
@@ -348,7 +365,7 @@ class UDExMastheadShell extends UI5Element {
348
365
 
349
366
  handleSearchClick(e: CustomEvent): void {
350
367
  e.stopPropagation();
351
- this._isSearchVisible = true;
368
+ this._isSearchOpened = true;
352
369
  this.resetSelectedItems();
353
370
  if (this._searchOpener) {
354
371
  this._searchOpener.selected = false;
@@ -369,7 +386,7 @@ class UDExMastheadShell extends UI5Element {
369
386
  handleMobileMenuClick(e: CustomEvent) {
370
387
  e.stopPropagation();
371
388
  this.setSelectedItem(e);
372
- this.addActiveMobileClass();
389
+ this._isMobileMenuOpen = true;
373
390
 
374
391
  if (this.bodyOverflow) {
375
392
  this.setOverflowBody();
@@ -378,12 +395,14 @@ class UDExMastheadShell extends UI5Element {
378
395
 
379
396
  handleMobileCloseClick(e: CustomEvent) {
380
397
  e.preventDefault();
381
- this.removeActiveMobileClass();
382
- this.setSelectedItem(e);
383
- this._mobileMenu?.showFirstLevelMenu();
398
+ this.closeMobileMenu();
399
+ }
384
400
 
385
- if (this.bodyOverflow) {
386
- this.removeOverflowBody();
401
+ handleEnterAndSpaceOnCloseBtn(e: KeyboardEvent) {
402
+ e.preventDefault();
403
+ if (isSpace(e) || isEnter(e)) {
404
+ this.closeMobileMenu();
405
+ this.mobileBtn?.focus();
387
406
  }
388
407
  }
389
408
 
@@ -425,14 +444,6 @@ class UDExMastheadShell extends UI5Element {
425
444
  });
426
445
  }
427
446
 
428
- addActiveMobileClass() {
429
- this._rootHolder?.classList.add(mobileMenuActiveClass);
430
- }
431
-
432
- removeActiveMobileClass() {
433
- this._rootHolder?.classList.remove(mobileMenuActiveClass);
434
- }
435
-
436
447
  setSelectedItem(e: CustomEvent): void {
437
448
  const clickedItem: UDExMastheadItem = e.detail.item;
438
449
  if (!clickedItem) {
@@ -449,11 +460,12 @@ class UDExMastheadShell extends UI5Element {
449
460
  focusSearchBtn(): void {
450
461
  if (this._searchOpener) {
451
462
  this._searchOpener.focus();
463
+ this._closeBtnClicked = false;
452
464
  }
453
465
  }
454
466
 
455
467
  hideSearch(): void {
456
- this._isSearchVisible = false;
468
+ this._isSearchOpened = false;
457
469
  this._closeBtnClicked = true;
458
470
  }
459
471
 
@@ -488,8 +500,8 @@ class UDExMastheadShell extends UI5Element {
488
500
  style.removeProperty("overflow");
489
501
  }
490
502
 
491
- resetMobileMenuOpenState(): void {
492
- this.removeActiveMobileClass();
503
+ closeMobileMenu(): void {
504
+ this._isMobileMenuOpen = false;
493
505
  this.resetSelectedItems();
494
506
  this._mobileMenu?.showFirstLevelMenu();
495
507
 
@@ -530,13 +542,29 @@ class UDExMastheadShell extends UI5Element {
530
542
  return !!this.search.length;
531
543
  }
532
544
 
545
+ get hasExploreSAP(): boolean {
546
+ return !!this.exploreSAP.length;
547
+ }
548
+
533
549
  get hasMobileMenuButtons(): boolean {
534
550
  return !!this.mobileMenu.length;
535
551
  }
536
552
 
537
- get isMobileView(): boolean {
553
+ get isBreakpointSizeM(): boolean {
538
554
  return window.innerWidth <= breakpointSizeM;
539
555
  }
556
+
557
+ get isMainMenuVisible(): boolean {
558
+ return !this.showSearchByDefault && !this._isSearchOpened;
559
+ }
560
+
561
+ get isRightMenuVisible(): boolean {
562
+ return this.showSearchByDefault || !this._isSearchOpened;
563
+ }
564
+
565
+ get isSearchVisible(): boolean {
566
+ return this.showSearchByDefault || this._isSearchOpened;
567
+ }
540
568
  }
541
569
 
542
570
  UDExMastheadShell.define();
@@ -133,9 +133,7 @@ class UDExMessageStrip extends MessageStrip {
133
133
  static i18nBundle: I18nBundle;
134
134
 
135
135
  static async onDefine() {
136
- UDExMessageStrip.i18nBundle = await getI18nBundle(
137
- "sap-ui-webcomponents-bundle",
138
- );
136
+ UDExMessageStrip.i18nBundle = await getI18nBundle("@udex/web-components");
139
137
  }
140
138
 
141
139
  getTranslation(text: I18nText): string {
package/src/Pagination.ts CHANGED
@@ -245,7 +245,7 @@ class UDExPagination extends UI5Element {
245
245
  }
246
246
 
247
247
  static async onDefine() {
248
- UDExPagination.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
248
+ UDExPagination.i18nBundle = await getI18nBundle("@udex/web-components");
249
249
  }
250
250
 
251
251
  setActive(element: HTMLElement): void {
@@ -194,7 +194,7 @@ class UDExPasswordField extends UI5Element {
194
194
  static i18nBundle: I18nBundle;
195
195
 
196
196
  static async onDefine() {
197
- UDExPasswordField.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
197
+ UDExPasswordField.i18nBundle = await getI18nBundle("@udex/web-components");
198
198
  }
199
199
 
200
200
  handleShowPassword(): void {
@@ -290,7 +290,7 @@ class UDExPhoneNumberField extends UI5Element {
290
290
  _handleResizeBound: ResizeObserverCallback;
291
291
 
292
292
  static async onDefine() {
293
- UDExPhoneNumberField.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
293
+ UDExPhoneNumberField.i18nBundle = await getI18nBundle("@udex/web-components");
294
294
  }
295
295
 
296
296
  get countrySelectorAriaLabel() {
package/src/RatingBar.ts CHANGED
@@ -72,7 +72,7 @@ class UDExRatingBar extends UI5Element {
72
72
  _maxPercentage: number = 100;
73
73
 
74
74
  static async onDefine() {
75
- UDExRatingBar.i18nBundle = await getI18nBundle("@ui5/webcomponents");
75
+ UDExRatingBar.i18nBundle = await getI18nBundle("@udex/web-components");
76
76
  }
77
77
 
78
78
  onBeforeRendering(): void {
package/src/Review.ts CHANGED
@@ -94,7 +94,7 @@ class UDExReview extends UI5Element {
94
94
  _maxRatingBars: number = 5;
95
95
 
96
96
  static async onDefine() {
97
- UDExReview.i18nBundle = await getI18nBundle("@ui5/webcomponents");
97
+ UDExReview.i18nBundle = await getI18nBundle("@udex/web-components");
98
98
  }
99
99
 
100
100
  get reviewsText(): string {
package/src/ReviewItem.ts CHANGED
@@ -146,7 +146,7 @@ class UDExReviewItem extends UI5Element {
146
146
  static i18nBundle: I18nBundle;
147
147
 
148
148
  static async onDefine() {
149
- UDExReviewItem.i18nBundle = await getI18nBundle("@ui5/webcomponents");
149
+ UDExReviewItem.i18nBundle = await getI18nBundle("@udex/web-components");
150
150
  }
151
151
 
152
152
  constructor() {
package/src/Search.ts CHANGED
@@ -504,7 +504,7 @@ class UDExSearch extends UI5Element {
504
504
  }
505
505
 
506
506
  static async onDefine(): Promise<void> {
507
- UDExSearch.i18nBundle = await getI18nBundle("udex-search");
507
+ UDExSearch.i18nBundle = await getI18nBundle("@udex/web-components");
508
508
  }
509
509
 
510
510
  onEnterDOM(): void {
@@ -241,9 +241,7 @@ class UDExSearchableListBase extends UI5Element {
241
241
  }
242
242
 
243
243
  onResetSearch() {
244
- const search = this.getSearch();
245
- search.value = "";
246
- this._filteredItems = this.filterItems(this.getProcessedItems(), "");
244
+ this.resetSearch();
247
245
  this.fireEvent("reset-search");
248
246
  }
249
247
 
@@ -253,6 +251,16 @@ class UDExSearchableListBase extends UI5Element {
253
251
  });
254
252
  }
255
253
 
254
+ /**
255
+ * Reset the search value.
256
+ * @public
257
+ */
258
+ resetSearch() {
259
+ const search = this.getSearch();
260
+ search.value = "";
261
+ this._filteredItems = this.filterItems(this.getProcessedItems(), "");
262
+ }
263
+
256
264
  filterItems(items: Array<ProcessedItem>, str: string): Array<ProcessedItem> {
257
265
  return items.filter(preparedItem => {
258
266
  const { isGroup, item } = preparedItem;
@@ -285,7 +293,7 @@ class UDExSearchableListBase extends UI5Element {
285
293
  return text.replace(new RegExp(`(${str})`, "i"), "<b>$&</b>");
286
294
  }
287
295
 
288
- isIncludes(string: string, value: string):boolean {
296
+ isIncludes(string: string, value: string): boolean {
289
297
  return string.toLowerCase().includes(value.toLowerCase());
290
298
  }
291
299
 
@@ -407,11 +415,11 @@ class UDExSearchableListBase extends UI5Element {
407
415
  return this.mode === ListMode.MultiSelect && isGrouping;
408
416
  }
409
417
 
410
- get additionalClassName() {
418
+ get additionalClassName(): string {
411
419
  return `udex-searchable-list__header`;
412
420
  }
413
421
 
414
- get groupClassName() {
422
+ get groupClassName(): string {
415
423
  const classHeader = `udex-searchable-list__header`;
416
424
  return this.showSearch ? `${classHeader} udex-searchable-list__header_no-margin` : classHeader;
417
425
  }
@@ -422,7 +430,7 @@ class UDExSearchableListBase extends UI5Element {
422
430
  }
423
431
 
424
432
  static async onDefine(): Promise<void> {
425
- UDExSearchableListBase.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
433
+ UDExSearchableListBase.i18nBundle = await getI18nBundle("@udex/web-components");
426
434
  }
427
435
  }
428
436
 
@@ -31,6 +31,7 @@
31
31
  mobile-link-title="{{this.mobileLinkTitle}}"
32
32
  target="{{this.target}}"
33
33
  .subItems="{{this.items}}"
34
+ _nav-items-length="{{../visibleItems.length}}"
34
35
  @ui5-sub-item-click="{{../handleSubItemClick}}"
35
36
  @ui5-nav-item-click="{{../handleItemClick}}">
36
37
  </udex-secondary-navigation-item>
@@ -41,6 +42,7 @@
41
42
  role="none"
42
43
  class="udex-secondary-navigation__list-item">
43
44
  <udex-secondary-navigation-item
45
+ _nav-items-length="{{visibleItems.length}}"
44
46
  index="{{visibleItems.length}}"
45
47
  @ui5-sub-item-click="{{../handleSubItemClick}}"
46
48
  @ui5-nav-item-click="{{../handleItemClick}}"
@@ -156,13 +156,13 @@ class UDExSecondaryNavigation extends UI5Element {
156
156
  static i18nBundle: any;
157
157
 
158
158
  static async onDefine(): Promise<void> {
159
- UDExSecondaryNavigation.i18nBundle = await getI18nBundle("udex-secondary-navigation");
159
+ UDExSecondaryNavigation.i18nBundle = await getI18nBundle("@udex/web-components");
160
160
  }
161
161
 
162
162
  constructor() {
163
163
  super();
164
164
  this._showMoreButton = true;
165
- this._boundReflowItems = this.reflowItems.bind(this);
165
+ this._boundReflowItems = this._handleResize.bind(this);
166
166
  }
167
167
 
168
168
  onEnterDOM(): void {
@@ -177,6 +177,13 @@ class UDExSecondaryNavigation extends UI5Element {
177
177
  ResizeHandler.deregister(this, this._boundReflowItems);
178
178
  }
179
179
 
180
+ _handleResize() {
181
+ this.reflowItems();
182
+ if (this._clickedNavItem && this.isDesktopScreen) {
183
+ this._clickedNavItem.closeDropdown();
184
+ }
185
+ }
186
+
180
187
  onInvalidation(changeInfo: ChangeInfo): void {
181
188
  if (changeInfo.name === "navItems") {
182
189
  this.reflowItems();
@@ -123,6 +123,14 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
123
123
  @property({ type: Boolean })
124
124
  isOpen!: boolean;
125
125
 
126
+ /**
127
+ * Defines the length of items in the secondary navigation.
128
+ *
129
+ * @private
130
+ */
131
+ @property({ validator: Integer })
132
+ _navItemsLength!: number;
133
+
126
134
  /**
127
135
  * Defines processed items.
128
136
  *
@@ -137,6 +145,10 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
137
145
  _subTitle!: string | undefined;
138
146
 
139
147
  onAfterRendering(): void {
148
+ if (this.isLastItem && this.isOpen && !this._isMobileView) {
149
+ this.setDropdownHorizontalAlign();
150
+ }
151
+
140
152
  if (this._shouldFocusFirstSubItem && this.isOpen) {
141
153
  this.onFirstSubItemFocus();
142
154
  this._shouldFocusFirstSubItem = false;
@@ -306,6 +318,19 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
306
318
  this._processedItems = this.subItems;
307
319
  }
308
320
 
321
+ setDropdownHorizontalAlign(): void {
322
+ const dropdown = this.shadowRoot!.querySelector<HTMLElement>(".udex-secondary-navigation__dropdown");
323
+ const { right, left } = dropdown!.getBoundingClientRect();
324
+
325
+ if (right > window.innerWidth) {
326
+ dropdown?.setAttribute("data-horizontal-align", "right");
327
+ }
328
+
329
+ if (left < 0) {
330
+ dropdown?.setAttribute("data-horizontal-align", "left");
331
+ }
332
+ }
333
+
309
334
  onFirstSubItemFocus(): void {
310
335
  this.domNavItems[0].focus();
311
336
  }
@@ -318,6 +343,10 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
318
343
  this._shouldFocusFirstSubItem = true;
319
344
  }
320
345
 
346
+ get isLastItem(): boolean {
347
+ return this._navItemsLength === this.index;
348
+ }
349
+
321
350
  get domNavItems(): Array<UDExSecondaryNavigationSubItem> {
322
351
  const domNavItems = this.shadowRoot?.querySelectorAll<UDExSecondaryNavigationSubItem>("udex-secondary-navigation-sub-item");
323
352
  return domNavItems ? Array.from(domNavItems) : [];