@sapudex/web-components 2.14.0 → 2.16.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 (236) hide show
  1. package/cypress/specs/Breadcrumbs.cy.tsx +77 -0
  2. package/cypress/specs/FilterMenu.cy.tsx +19 -43
  3. package/cypress/specs/HeroBanner.cy.tsx +6 -6
  4. package/cypress/specs/InputGroup.cy.tsx +47 -0
  5. package/cypress/specs/RatingBar.cy.tsx +41 -0
  6. package/cypress/specs/Tooltip.cy.tsx +6 -11
  7. package/cypress/support/component-imports.instrumented.ts +4 -0
  8. package/cypress/support/component-imports.src.ts +4 -0
  9. package/dist/Accordion.js +44 -30
  10. package/dist/Accordion.js.map +1 -1
  11. package/dist/Breadcrumbs.d.ts +2 -0
  12. package/dist/Breadcrumbs.js +8 -7
  13. package/dist/Breadcrumbs.js.map +1 -1
  14. package/dist/BreadcrumbsItem.d.ts +1 -2
  15. package/dist/BreadcrumbsItem.js.map +1 -1
  16. package/dist/BreadcrumbsPopoverTemplate.d.ts +2 -0
  17. package/dist/BreadcrumbsPopoverTemplate.js +8 -0
  18. package/dist/BreadcrumbsPopoverTemplate.js.map +1 -0
  19. package/dist/BreadcrumbsTemplate.d.ts +2 -0
  20. package/dist/BreadcrumbsTemplate.js +10 -0
  21. package/dist/BreadcrumbsTemplate.js.map +1 -0
  22. package/dist/FilterMenu.js +1 -2
  23. package/dist/FilterMenu.js.map +1 -1
  24. package/dist/FilterMenuSelectAll.d.ts +0 -1
  25. package/dist/FilterMenuSelectAll.js +0 -3
  26. package/dist/FilterMenuSelectAll.js.map +1 -1
  27. package/dist/Footer.d.ts +17 -21
  28. package/dist/Footer.js +5 -11
  29. package/dist/Footer.js.map +1 -1
  30. package/dist/FooterTemplate.d.ts +2 -0
  31. package/dist/FooterTemplate.js +27 -0
  32. package/dist/FooterTemplate.js.map +1 -0
  33. package/dist/HeroBanner.js +4 -4
  34. package/dist/HeroBanner.js.map +1 -1
  35. package/dist/HeroBannerTemplate.d.ts +2 -0
  36. package/dist/HeroBannerTemplate.js +10 -0
  37. package/dist/HeroBannerTemplate.js.map +1 -0
  38. package/dist/InputGroup.d.ts +0 -1
  39. package/dist/InputGroup.js +3 -6
  40. package/dist/InputGroup.js.map +1 -1
  41. package/dist/InputGroupTemplate.d.ts +2 -0
  42. package/dist/InputGroupTemplate.js +7 -0
  43. package/dist/InputGroupTemplate.js.map +1 -0
  44. package/dist/MastheadMobileMenu.js +1 -1
  45. package/dist/MastheadMobileMenu.js.map +1 -1
  46. package/dist/RatingBar.js +3 -3
  47. package/dist/RatingBar.js.map +1 -1
  48. package/dist/RatingBarTemplate.d.ts +2 -0
  49. package/dist/RatingBarTemplate.js +8 -0
  50. package/dist/RatingBarTemplate.js.map +1 -0
  51. package/dist/Search.js +5 -4
  52. package/dist/Search.js.map +1 -1
  53. package/dist/SearchableListBase.d.ts +2 -1
  54. package/dist/SearchableListBase.js +13 -23
  55. package/dist/SearchableListBase.js.map +1 -1
  56. package/dist/SelectBox.js +1 -2
  57. package/dist/SelectBox.js.map +1 -1
  58. package/dist/StatusBadge.js +3 -3
  59. package/dist/StatusBadge.js.map +1 -1
  60. package/dist/StatusBadgeTemplate.d.ts +2 -0
  61. package/dist/StatusBadgeTemplate.js +7 -0
  62. package/dist/StatusBadgeTemplate.js.map +1 -0
  63. package/dist/StatusMessage.js +3 -3
  64. package/dist/StatusMessage.js.map +1 -1
  65. package/dist/StatusMessageTemplate.d.ts +2 -0
  66. package/dist/StatusMessageTemplate.js +8 -0
  67. package/dist/StatusMessageTemplate.js.map +1 -0
  68. package/dist/Switch.d.ts +1 -4
  69. package/dist/Switch.js +4 -8
  70. package/dist/Switch.js.map +1 -1
  71. package/dist/SwitchTemplate.d.ts +2 -0
  72. package/dist/SwitchTemplate.js +12 -0
  73. package/dist/SwitchTemplate.js.map +1 -0
  74. package/dist/TagGroup.d.ts +2 -0
  75. package/dist/TagGroup.js +10 -3
  76. package/dist/TagGroup.js.map +1 -1
  77. package/dist/TruncatedText.d.ts +0 -1
  78. package/dist/TruncatedText.js +5 -6
  79. package/dist/TruncatedText.js.map +1 -1
  80. package/dist/TruncatedTextTemplate.d.ts +2 -0
  81. package/dist/TruncatedTextTemplate.js +9 -0
  82. package/dist/TruncatedTextTemplate.js.map +1 -0
  83. package/dist/assets/{InputSuggestions-AxcsfuTc.js → InputSuggestions-lpqKgn1j.js} +1 -1
  84. package/dist/assets/{ListItemStandardExpandableTextTemplate-CaS49yZt.js → ListItemStandardExpandableTextTemplate-BPs3CyVq.js} +1 -1
  85. package/dist/assets/{bundle.esm-DzkSPQ0p.js → bundle.esm-C3RAGF4b.js} +211 -211
  86. package/dist/css/themes/AccordionItem.css +1 -1
  87. package/dist/css/themes/CountrySelector.css +1 -1
  88. package/dist/css/themes/Link.css +1 -1
  89. package/dist/css/themes/MediaPlayer.css +1 -1
  90. package/dist/css/themes/PhoneNumberField.css +1 -1
  91. package/dist/css/themes/RatingBar.css +1 -1
  92. package/dist/css/themes/RatingIndicator.css +1 -1
  93. package/dist/css/themes/Search.css +1 -1
  94. package/dist/css/themes/SelectBox.css +1 -1
  95. package/dist/css/themes/Slider.css +1 -1
  96. package/dist/css/themes/TextArea.css +1 -1
  97. package/dist/css/themes/TextField.css +1 -1
  98. package/dist/custom-elements-internal.json +148 -133
  99. package/dist/custom-elements.json +133 -118
  100. package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
  101. package/dist/generated/themes/AccordionItem.css.js +1 -1
  102. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  103. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  104. package/dist/generated/themes/CountrySelector.css.js +1 -1
  105. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  106. package/dist/generated/themes/Link.css.d.ts +1 -1
  107. package/dist/generated/themes/Link.css.js +1 -1
  108. package/dist/generated/themes/Link.css.js.map +1 -1
  109. package/dist/generated/themes/MediaPlayer.css.d.ts +1 -1
  110. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  111. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  112. package/dist/generated/themes/PhoneNumberField.css.d.ts +1 -1
  113. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  114. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  115. package/dist/generated/themes/RatingBar.css.d.ts +1 -1
  116. package/dist/generated/themes/RatingBar.css.js +1 -1
  117. package/dist/generated/themes/RatingBar.css.js.map +1 -1
  118. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  119. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  120. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  121. package/dist/generated/themes/Search.css.d.ts +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/SelectBox.css.d.ts +1 -1
  125. package/dist/generated/themes/SelectBox.css.js +1 -1
  126. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  127. package/dist/generated/themes/Slider.css.d.ts +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/generated/themes/TextArea.css.d.ts +1 -1
  131. package/dist/generated/themes/TextArea.css.js +1 -1
  132. package/dist/generated/themes/TextArea.css.js.map +1 -1
  133. package/dist/generated/themes/TextField.css.d.ts +1 -1
  134. package/dist/generated/themes/TextField.css.js +1 -1
  135. package/dist/generated/themes/TextField.css.js.map +1 -1
  136. package/dist/utils/sanitizeString.d.ts +2 -0
  137. package/dist/utils/sanitizeString.js +12 -0
  138. package/dist/utils/sanitizeString.js.map +1 -0
  139. package/dist/web-types.json +2 -2
  140. package/package.json +2 -2
  141. package/src/Accordion.ts +56 -26
  142. package/src/Breadcrumbs.ts +12 -7
  143. package/src/BreadcrumbsItem.ts +2 -2
  144. package/src/BreadcrumbsPopoverTemplate.tsx +60 -0
  145. package/src/BreadcrumbsTemplate.tsx +53 -0
  146. package/src/FilterMenu.ts +1 -2
  147. package/src/FilterMenuSelectAll.ts +0 -4
  148. package/src/Footer.ts +28 -35
  149. package/src/FooterTemplate.tsx +410 -0
  150. package/src/HeroBanner.ts +4 -4
  151. package/src/HeroBannerTemplate.tsx +101 -0
  152. package/src/InputGroup.ts +3 -7
  153. package/src/InputGroupTemplate.tsx +31 -0
  154. package/src/MastheadMobileMenu.ts +1 -1
  155. package/src/RatingBar.ts +3 -3
  156. package/src/RatingBarTemplate.tsx +38 -0
  157. package/src/Search.ts +5 -4
  158. package/src/SearchableListBase.ts +15 -26
  159. package/src/SelectBox.ts +1 -2
  160. package/src/StatusBadge.ts +5 -4
  161. package/src/StatusBadgeTemplate.tsx +18 -0
  162. package/src/StatusMessage.ts +3 -3
  163. package/src/StatusMessageTemplate.tsx +20 -0
  164. package/src/Switch.ts +5 -11
  165. package/src/SwitchTemplate.tsx +50 -0
  166. package/src/TagGroup.ts +13 -3
  167. package/src/TruncatedText.ts +8 -14
  168. package/src/TruncatedTextTemplate.tsx +21 -0
  169. package/src/generated/themes/AccordionItem.css.ts +1 -1
  170. package/src/generated/themes/CountrySelector.css.ts +1 -1
  171. package/src/generated/themes/Link.css.ts +1 -1
  172. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  173. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  174. package/src/generated/themes/RatingBar.css.ts +1 -1
  175. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  176. package/src/generated/themes/Search.css.ts +1 -1
  177. package/src/generated/themes/SelectBox.css.ts +1 -1
  178. package/src/generated/themes/Slider.css.ts +1 -1
  179. package/src/generated/themes/TextArea.css.ts +1 -1
  180. package/src/generated/themes/TextField.css.ts +1 -1
  181. package/src/themes/AccordionItem.css +0 -1
  182. package/src/themes/CountrySelector.css +1 -7
  183. package/src/themes/Link.css +11 -4
  184. package/src/themes/MediaPlayer.css +133 -186
  185. package/src/themes/PhoneNumberField.css +25 -7
  186. package/src/themes/RatingBar.css +2 -2
  187. package/src/themes/Search.css +7 -3
  188. package/src/themes/SelectBox.css +4 -0
  189. package/src/themes/TextArea.css +31 -7
  190. package/src/themes/TextField.css +15 -5
  191. package/src/utils/sanitizeString.ts +13 -0
  192. package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.d.ts +0 -3
  193. package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.js +0 -12
  194. package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.js.map +0 -1
  195. package/dist/generated/templates/BreadcrumbsTemplate.lit.d.ts +0 -3
  196. package/dist/generated/templates/BreadcrumbsTemplate.lit.js +0 -14
  197. package/dist/generated/templates/BreadcrumbsTemplate.lit.js.map +0 -1
  198. package/dist/generated/templates/FooterTemplate.lit.d.ts +0 -3
  199. package/dist/generated/templates/FooterTemplate.lit.js +0 -39
  200. package/dist/generated/templates/FooterTemplate.lit.js.map +0 -1
  201. package/dist/generated/templates/InputGroupTemplate.lit.d.ts +0 -3
  202. package/dist/generated/templates/InputGroupTemplate.lit.js +0 -9
  203. package/dist/generated/templates/InputGroupTemplate.lit.js.map +0 -1
  204. package/dist/generated/templates/RatingBarTemplate.lit.d.ts +0 -3
  205. package/dist/generated/templates/RatingBarTemplate.lit.js +0 -8
  206. package/dist/generated/templates/RatingBarTemplate.lit.js.map +0 -1
  207. package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +0 -3
  208. package/dist/generated/templates/StatusBadgeTemplate.lit.js +0 -7
  209. package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +0 -1
  210. package/dist/generated/templates/StatusMessageTemplate.lit.d.ts +0 -3
  211. package/dist/generated/templates/StatusMessageTemplate.lit.js +0 -8
  212. package/dist/generated/templates/StatusMessageTemplate.lit.js.map +0 -1
  213. package/dist/generated/templates/SwitchTemplate.lit.d.ts +0 -3
  214. package/dist/generated/templates/SwitchTemplate.lit.js +0 -14
  215. package/dist/generated/templates/SwitchTemplate.lit.js.map +0 -1
  216. package/dist/generated/templates/TruncatedTextTemplate.lit.d.ts +0 -3
  217. package/dist/generated/templates/TruncatedTextTemplate.lit.js +0 -7
  218. package/dist/generated/templates/TruncatedTextTemplate.lit.js.map +0 -1
  219. package/src/Breadcrumbs.hbs +0 -38
  220. package/src/BreadcrumbsPopover.hbs +0 -48
  221. package/src/Footer.hbs +0 -296
  222. package/src/InputGroup.hbs +0 -20
  223. package/src/RatingBar.hbs +0 -11
  224. package/src/StatusBadge.hbs +0 -9
  225. package/src/StatusMessage.hbs +0 -6
  226. package/src/Switch.hbs +0 -35
  227. package/src/TruncatedText.hbs +0 -11
  228. package/src/generated/templates/BreadcrumbsPopoverTemplate.lit.ts +0 -16
  229. package/src/generated/templates/BreadcrumbsTemplate.lit.ts +0 -18
  230. package/src/generated/templates/FooterTemplate.lit.ts +0 -43
  231. package/src/generated/templates/InputGroupTemplate.lit.ts +0 -13
  232. package/src/generated/templates/RatingBarTemplate.lit.ts +0 -12
  233. package/src/generated/templates/StatusBadgeTemplate.lit.ts +0 -11
  234. package/src/generated/templates/StatusMessageTemplate.lit.ts +0 -12
  235. package/src/generated/templates/SwitchTemplate.lit.ts +0 -18
  236. package/src/generated/templates/TruncatedTextTemplate.lit.ts +0 -11
package/src/Accordion.ts CHANGED
@@ -7,7 +7,9 @@ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
7
7
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
9
9
  import "@ui5/webcomponents-icons/dist/feeder-arrow.js";
10
- import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
10
+ import {
11
+ isEnter, isSpace, isUp, isDown, isEnd, isHome, isTabPrevious, isTabNext,
12
+ } from "@ui5/webcomponents-base/dist/Keys.js";
11
13
  import AccordionTemplate from "./AccordionTemplate.js";
12
14
  import type UDExAccordionItem from "./AccordionItem.js";
13
15
  import { COLLAPSE_ALL, EXPAND_ALL } from "./generated/i18n/i18n-defaults.js";
@@ -153,39 +155,67 @@ class UDExAccordion extends UI5Element {
153
155
  }
154
156
 
155
157
  keydownHandler(e: KeyboardEvent) {
156
- if (e.key !== "Tab") {
157
- e.preventDefault();
158
- }
159
- const len = this._items.length;
158
+ const activeItem = this._items[this._activeItemIndex];
159
+ const previousItem = this._items[this._activeItemIndex - 1];
160
+ const isLastItem = this._activeItemIndex === this._items.length - 1;
161
+ const isFirstItem = this._activeItemIndex === 0;
162
+ const lastItem = this._items[this._items.length - 1];
163
+
164
+ const updateTabIndex = (elements: NodeListOf<Element>, value: string) => {
165
+ elements.forEach(element => element.setAttribute("tabindex", value));
166
+ };
167
+
168
+ const getInteractiveElements = (item: HTMLElement) => {
169
+ const selectors = ["button", "a[href]", "input", "select", "textarea", "[tabindex]"];
170
+ return item.querySelectorAll(selectors.join(","));
171
+ };
172
+
173
+ const handleTabNavigation = (keyboardEvent: KeyboardEvent) => {
174
+ if (isLastItem && isTabNext(keyboardEvent) && !lastItem.expanded) {
175
+ updateTabIndex(getInteractiveElements(activeItem), "-1");
176
+ return true;
177
+ }
178
+
179
+ if ((activeItem?.expanded && isTabNext(e))
180
+ || (previousItem?.expanded && isTabPrevious(e))
181
+ || (isFirstItem && isTabPrevious(e))) {
182
+ return true;
183
+ }
184
+
185
+ if (isEnter(e) && isLastItem) {
186
+ updateTabIndex(getInteractiveElements(activeItem), "0");
187
+ }
188
+
189
+ return false;
190
+ };
191
+
160
192
  const focusOnItem = (itemIndex: number) => {
161
193
  const item = this._items[itemIndex];
162
194
  this._activeItemIndex = itemIndex;
163
195
  (item?.shadowRoot?.querySelector(".udex-accordion-item__header") as HTMLElement)?.focus();
164
196
  };
165
197
 
166
- switch (e.key) {
167
- case "Home":
198
+ if (handleTabNavigation(e)) {
199
+ return;
200
+ }
201
+
202
+ e.preventDefault();
203
+ const len = this._items.length;
204
+
205
+ if (isHome(e)) {
168
206
  focusOnItem(0);
169
- break;
170
- case "End":
207
+ }
208
+
209
+ if (isEnd(e)) {
171
210
  focusOnItem(len - 1);
172
- break;
173
- case "ArrowUp":
174
- if (this._activeItemIndex > 0) {
175
- focusOnItem(this._activeItemIndex - 1);
176
- } else if (this._activeItemIndex === 0) {
177
- focusOnItem(len - 1);
178
- }
179
- break;
180
- case "ArrowDown":
181
- if (this._activeItemIndex < len - 1) {
182
- focusOnItem(this._activeItemIndex + 1);
183
- } else if (this._activeItemIndex === len - 1) {
184
- focusOnItem(0);
185
- }
186
- break;
187
- default:
188
- break;
211
+ }
212
+
213
+ if (isTabPrevious(e) || isUp(e)) {
214
+ focusOnItem(this._activeItemIndex > 0 ? this._activeItemIndex - 1 : len - 1);
215
+ }
216
+
217
+ if (isTabNext(e) || isDown(e)) {
218
+ focusOnItem(this._activeItemIndex < len - 1 ? this._activeItemIndex + 1 : 0);
189
219
  }
190
220
  }
191
221
 
@@ -1,6 +1,6 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
4
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
5
  import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
6
6
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
@@ -14,7 +14,7 @@ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
14
14
  import UI5BreadcrumbsCss from "@ui5/webcomponents/dist/generated/themes/Breadcrumbs.css.js";
15
15
  import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
16
16
  import "@ui5/webcomponents-icons/dist/home.js";
17
- import BreadcrumbsTemplate from "./generated/templates/BreadcrumbsTemplate.lit.js";
17
+ import BreadcrumbsTemplate from "./BreadcrumbsTemplate.js";
18
18
  import UDExBreadcrumbsItem from "./BreadcrumbsItem.js";
19
19
  import UDExDropdown from "./Dropdown.js";
20
20
  import UDExLink from "./Link.js";
@@ -24,8 +24,6 @@ import { BREADCRUMBS_ARIA_LABEL, BREADCRUMBS_OVERFLOW_ARIA_LABEL } from "./gener
24
24
  import BreadcrumbsCss from "./generated/themes/Breadcrumbs.css.js";
25
25
  import BreadcrumbsPopoverCss from "./generated/themes/BreadcrumbsPopover.css.js";
26
26
 
27
- const triggerActiveClass = "udex-breadcrumbs__trigger--opened";
28
-
29
27
  type UDExBreadcrumbsItemClickEventDetail = {
30
28
  item: UDExBreadcrumbsItem;
31
29
  altKey?: boolean;
@@ -53,7 +51,7 @@ type UDExBreadcrumbsItemClickEventDetail = {
53
51
  */
54
52
  @customElement({
55
53
  tag: "udex-breadcrumbs",
56
- renderer: litRender,
54
+ renderer: jsxRenderer,
57
55
  styles: [UI5BreadcrumbsCss, BreadcrumbsCss, BreadcrumbsPopoverCss],
58
56
  template: BreadcrumbsTemplate,
59
57
  dependencies: [UDExBreadcrumbsItem, UDExLink, UDExDropdown, UI5Icon],
@@ -116,6 +114,12 @@ class UDExBreadcrumbs extends UI5Element {
116
114
  _responsivePopover?: UDExDropdown;
117
115
  _itemNavigation?: ItemNavigation;
118
116
  _shouldFocusFirstVisibleItem!: boolean;
117
+ _rootClass: string;
118
+
119
+ constructor() {
120
+ super();
121
+ this._rootClass = "udex-breadcrumbs";
122
+ }
119
123
 
120
124
  onBeforeRendering(): void {
121
125
  this._preprocessItems();
@@ -232,7 +236,7 @@ class UDExBreadcrumbs extends UI5Element {
232
236
  }
233
237
 
234
238
  _handleKeydown(e: KeyboardEvent): void {
235
- const itemIndex = (e.target as HTMLElement).getAttribute("index");
239
+ const itemIndex = (e.target as HTMLElement).getAttribute("data-index");
236
240
  const isLastItem = itemIndex === (this.items.length - 2).toString();
237
241
  const isFirstItem = itemIndex === "0";
238
242
 
@@ -304,7 +308,8 @@ class UDExBreadcrumbs extends UI5Element {
304
308
  }
305
309
 
306
310
  get _triggerClass(): string {
307
- return this._dropdownOpened ? triggerActiveClass : "";
311
+ const rootClass = "udex-breadcrumbs";
312
+ return this._dropdownOpened ? `${rootClass} ${rootClass}__trigger--opened` : rootClass;
308
313
  }
309
314
 
310
315
  get _accessibleNameText(): string {
@@ -24,11 +24,11 @@ import BreadcrumbsItem from "@ui5/webcomponents/dist/BreadcrumbsItem.js";
24
24
  tag: "udex-breadcrumbs-item",
25
25
  renderer: jsxRenderer,
26
26
  })
27
+
27
28
  class UDExBreadcrumbsItem extends BreadcrumbsItem {
28
29
  /**
29
30
  * Defines item icon to be displayed before the item name.
30
- *
31
- * @default ""
31
+ * @default undefined
32
32
  * @public
33
33
  */
34
34
  @property()
@@ -0,0 +1,60 @@
1
+ import type Breadcrumbs from "./Breadcrumbs.js";
2
+ import UDExDropdown from "./Dropdown.js";
3
+ import UDExLink from "./Link.js";
4
+ import { Placement, HorizontalAlign } from "./types/Dropdown.js";
5
+
6
+ export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
7
+ return (
8
+ <UDExDropdown
9
+ id={`udex-${this._id}-breadcrumbs__popover`}
10
+ opener={`udex-${this._id}-breadcrumbs__opener`}
11
+ class={`${this._rootClass}__popover ui5-breadcrumbs-popover`}
12
+ placement={Placement.Bottom}
13
+ horizontalAlign={HorizontalAlign.Start}
14
+ onKeyDown={this._handleKeydown}
15
+ onClose={this._afterDropdownClose}
16
+ onOpen={this._afterDropdownOpen}>
17
+ <div className={`${this._rootClass}__popover-content`}>
18
+ {this._dropdownItems.map((item, index) => (
19
+ item.icon ? (
20
+ <UDExLink
21
+ key={index}
22
+ data-index={index}
23
+ id={`${item._id}-li`}
24
+ onClick={this._onDropdownLinkPress}
25
+ href={item.href}
26
+ target={item.target}
27
+ class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
28
+ icon={item.icon}
29
+ accessibleName={item.textContent ?? undefined}
30
+ data-ui5-stable={item.stableDomRef}>
31
+ {item.textContent}
32
+ </UDExLink>
33
+ ) : item._isCurrentPageItem ? (
34
+ <span
35
+ key={index}
36
+ id={`${item._id}-li`}
37
+ className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
38
+ accessible-name={item.accessibleName}
39
+ data-ui5-stable={item.stableDomRef}>
40
+ {item.textContent}
41
+ </span>
42
+ ) : (
43
+ <UDExLink
44
+ key={index}
45
+ data-index={index}
46
+ id={`${item._id}-li`}
47
+ onClick={this._onDropdownLinkPress}
48
+ href={item.href}
49
+ target={item.target}
50
+ class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
51
+ accessibleName={item.accessibleName}
52
+ data-ui5-stable={item.stableDomRef}>
53
+ {item.textContent}
54
+ </UDExLink>
55
+ )
56
+ ))}
57
+ </div>
58
+ </UDExDropdown>
59
+ );
60
+ }
@@ -0,0 +1,53 @@
1
+ import type Breadcrumbs from "./Breadcrumbs.js";
2
+ import UDExLink from "./Link.js";
3
+ import UDExButtonAccessibleRole from "./types/ButtonAccessibleRole.js";
4
+ import slimArrowDown from "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
5
+ import BreadcrumbsPopoverTemplate from "./BreadcrumbsPopoverTemplate.js";
6
+
7
+ export default function BreadcrumbsTemplate(this: Breadcrumbs) {
8
+ const rootClass = "udex-breadcrumbs";
9
+
10
+ return (
11
+ <>
12
+ <nav
13
+ class={`${this._rootClass} ui5-breadcrumbs-root`}
14
+ aria-label={this._accessibleNameText}>
15
+ <ol onFocusIn={this._onfocusin}>
16
+ <li class={`${this._rootClass}__arrow-wrapper ui5-breadcrumbs-dropdown-arrow-link-wrapper`}>
17
+ <UDExLink
18
+ id={`udex-${this._id}-breadcrumbs__opener`}
19
+ class={`${this._rootClass}__trigger ${this._triggerClass}`}
20
+ onClick={this._toggleDropdown}
21
+ aria-label={this._dropdownArrowAccessibleNameText}
22
+ accessibleRole={UDExButtonAccessibleRole.Button}
23
+ icon={slimArrowDown}
24
+ aria-haspopup="true">
25
+ </UDExLink>
26
+ </li>
27
+ {this._linksData.map(linkData =>
28
+ <li
29
+ class={`${this._rootClass}__link-wrapper ui5-breadcrumbs-link-wrapper`}
30
+ id={`${linkData._id}-link-wrapper`}>
31
+ {!linkData._isCurrentPageItem && (
32
+ <>
33
+ <span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
34
+ <UDExLink
35
+ onClick={this._onLinkPress}
36
+ id={`${linkData._id}-link`}
37
+ class={`${rootClass}__item ${this._rootClass}__item--visible`}
38
+ href={linkData.href}
39
+ target={linkData.target}
40
+ accessibleName={linkData._accessibleNameText}
41
+ data-ui5-stable={linkData.stableDomRef}>
42
+ {linkData.innerText}
43
+ </UDExLink>
44
+ </>
45
+ )}
46
+ </li>
47
+ )}
48
+ </ol>
49
+ </nav>
50
+ {BreadcrumbsPopoverTemplate.call(this)}
51
+ </>
52
+ );
53
+ }
package/src/FilterMenu.ts CHANGED
@@ -332,8 +332,7 @@ class UDExFilterMenu extends UDExSearchableListBase {
332
332
  }
333
333
 
334
334
  handleSelectAll(e:CustomEvent): void {
335
- this.onFilterSelectAllHeaderPress(e);
336
- this.fireDecoratorEvent("select-all");
335
+ this.onSelectAllHeaderPress(e);
337
336
  }
338
337
 
339
338
  handleItemPress(e:CustomEvent): void {
@@ -28,10 +28,6 @@ class UDExFilterMenuSelectAll extends UDExListGroupHeaderBase {
28
28
  get isSelectAllHeader() {
29
29
  return true;
30
30
  }
31
-
32
- get isFilterMenuSelectAllHeader() {
33
- return true;
34
- }
35
31
  }
36
32
 
37
33
  UDExFilterMenuSelectAll.define();
package/src/Footer.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
2
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
3
3
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
5
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
6
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
7
7
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
8
-
9
8
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
10
9
  import { getLanguage } from "@ui5/webcomponents-base/dist/config/Language.js";
10
+ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
11
+ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
11
12
  import Icon from "@ui5/webcomponents/dist/Icon.js";
12
13
  import UDExAccordionItem from "./AccordionItem.js";
13
14
  import UDExButton from "./Button.js";
@@ -19,14 +20,7 @@ import type { UDExSocialMediaButtonType } from "./types/SocialMediaButtonType.js
19
20
  import type { UDExTarget } from "./types/common.js";
20
21
  import { BreakpointUtils } from "./utils/Breakpoints.js";
21
22
  import parseArrayFromString from "./utils/parseArrayFromString.js";
22
-
23
- // Template
24
- import FooterTemplate from "./generated/templates/FooterTemplate.lit.js";
25
-
26
- // Styles
27
- import FooterCss from "./generated/themes/Footer.css.js";
28
- import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
29
- import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
23
+ import FooterTemplate from "./FooterTemplate.js";
30
24
  import {
31
25
  ABOUT_SAP,
32
26
  CHAT_WITH_US,
@@ -42,15 +36,14 @@ import {
42
36
  PUBLIC_SECURITY_NETWORK_NUMBER,
43
37
  ICP_NUMBER,
44
38
  } from "./generated/i18n/i18n-defaults.js";
45
- import "@ui5/webcomponents-icons/dist/headset.js";
46
- import "@ui5/webcomponents-icons/dist/email.js";
47
- import "@ui5/webcomponents-icons/dist/back-to-top.js";
48
- import "@ui5/webcomponents-icons/dist/discussion-2.js";
49
- import "@ui5/webcomponents-icons/dist/navigation-right-arrow.js";
39
+
40
+ // Styles
41
+ import FooterCss from "./generated/themes/Footer.css.js";
50
42
 
51
43
  export const chineseICPDefaultLink = "https://beian.miit.gov.cn/";
52
44
 
53
45
  export type FooterLink = {
46
+ id: string;
54
47
  title: string;
55
48
  url: string;
56
49
  target: UDExTarget;
@@ -70,14 +63,14 @@ export type FooterContactNumber = {
70
63
  };
71
64
 
72
65
  type UDExFooterDetailedClickEventDetail = {
73
- originalEvent: PointerEvent,
66
+ originalEvent: MouseEvent,
74
67
  name: string | undefined;
75
68
  id?: string;
76
69
  sourceNode: HTMLElement;
77
70
  }
78
71
 
79
72
  type UDExFooterBaseEventDetail = {
80
- originalEvent: PointerEvent,
73
+ originalEvent: MouseEvent | Event,
81
74
  }
82
75
 
83
76
  type BaseEvents = "contact-chat-click" | "contact-phone-local-numbers-click" | "contact-email-click" | "contact-phone-click" | "logo-click" | "back-to-top-click";
@@ -106,7 +99,7 @@ type DetailedEvents = "quick-links-click" | "trending-click" | "about-sap-click"
106
99
  @customElement({
107
100
  languageAware: true,
108
101
  tag: "udex-footer",
109
- renderer: litRender,
102
+ renderer: jsxRenderer,
110
103
  styles: [FooterCss],
111
104
  template: FooterTemplate,
112
105
  dependencies: [UDExAccordion, UDExAccordionItem, Icon, UDExButton, UDExDivider, UDExLink, UDExSocialMediaButton],
@@ -437,7 +430,7 @@ class UDExFooter extends UI5Element {
437
430
  this._shouldRenderMobileMenu = this.isMobile;
438
431
  }
439
432
 
440
- onBackToTopClick(e: PointerEvent): void {
433
+ onBackToTopClick(e: Event): void {
441
434
  this.fireFooterBaseEvent(e, "back-to-top-click");
442
435
 
443
436
  window.scrollTo(0, 0);
@@ -490,19 +483,19 @@ class UDExFooter extends UI5Element {
490
483
  return UDExFooter.i18nBundle.getText(CHAT_WITH_US);
491
484
  }
492
485
 
493
- get _quickLinksTitle() {
486
+ get _quickLinksTitle(): string {
494
487
  return this.quickLinksTitle || UDExFooter.i18nBundle.getText(QUICK_LINKS);
495
488
  }
496
489
 
497
- get _trendingTitle() {
490
+ get _trendingTitle(): string {
498
491
  return this.trendingTitle || UDExFooter.i18nBundle.getText(TRENDING);
499
492
  }
500
493
 
501
- get _aboutSapTitle() {
494
+ get _aboutSapTitle(): string {
502
495
  return this.aboutSapTitle || UDExFooter.i18nBundle.getText(ABOUT_SAP);
503
496
  }
504
497
 
505
- get _siteInformationTitle() {
498
+ get _siteInformationTitle(): string {
506
499
  return this.siteInformationTitle || UDExFooter.i18nBundle.getText(SITE_INFORMATION);
507
500
  }
508
501
 
@@ -568,48 +561,48 @@ class UDExFooter extends UI5Element {
568
561
  return this.isChineseLang && this.chineseLogoUrl ? `${root}-chinese` : root;
569
562
  }
570
563
 
571
- _onLogoClick(e: PointerEvent): void {
564
+ _onLogoClick(e: MouseEvent): void {
572
565
  this.fireFooterBaseEvent(e, "logo-click");
573
566
  }
574
567
 
575
- _onContactPhoneClick(e: PointerEvent): void {
568
+ _onContactPhoneClick(e: MouseEvent): void {
576
569
  this.fireFooterBaseEvent(e, "contact-phone-click");
577
570
  }
578
- _onContactPhoneLocalNumbersClick(e: PointerEvent): void {
571
+ _onContactPhoneLocalNumbersClick(e: Event): void {
579
572
  this.fireFooterBaseEvent(e, "contact-phone-local-numbers-click");
580
573
  }
581
- _onContactEmailClick(e: PointerEvent): void {
574
+ _onContactEmailClick(e: MouseEvent): void {
582
575
  this.fireFooterBaseEvent(e, "contact-email-click");
583
576
  }
584
- _onContactChatClick(e: PointerEvent): void {
577
+ _onContactChatClick(e: MouseEvent): void {
585
578
  this.fireFooterBaseEvent(e, "contact-chat-click");
586
579
  }
587
580
 
588
- _onQuickLinksClick(e: PointerEvent): void {
581
+ _onQuickLinksClick(e: MouseEvent): void {
589
582
  this.fireFooterDetailedClickEvent(e, "quick-links-click");
590
583
  }
591
584
 
592
- _onTrendingClick(e: PointerEvent): void {
585
+ _onTrendingClick(e: MouseEvent): void {
593
586
  this.fireFooterDetailedClickEvent(e, "trending-click");
594
587
  }
595
588
 
596
- _onAboutSapClick(e: PointerEvent): void {
589
+ _onAboutSapClick(e: MouseEvent): void {
597
590
  this.fireFooterDetailedClickEvent(e, "about-sap-click");
598
591
  }
599
592
 
600
- _onSiteInformationClick(e: PointerEvent): void {
593
+ _onSiteInformationClick(e: MouseEvent): void {
601
594
  this.fireFooterDetailedClickEvent(e, "site-information-click");
602
595
  }
603
596
 
604
- _onSocialMediaLinkClick(e: PointerEvent): void {
597
+ _onSocialMediaLinkClick(e: MouseEvent): void {
605
598
  this.fireFooterDetailedClickEvent(e, "social-media-link-click");
606
599
  }
607
600
 
608
- fireFooterBaseEvent(e: PointerEvent, eventName: BaseEvents): void {
601
+ fireFooterBaseEvent(e: MouseEvent | Event, eventName: BaseEvents): void {
609
602
  this.fireDecoratorEvent(eventName, { originalEvent: e });
610
603
  }
611
604
 
612
- fireFooterDetailedClickEvent(e: PointerEvent, eventName: DetailedEvents): void {
605
+ fireFooterDetailedClickEvent(e: MouseEvent, eventName: DetailedEvents): void {
613
606
  const sourceNode = e.composedPath()[0] as HTMLElement;
614
607
  const { innerText, dataset: { id, name } } = sourceNode;
615
608