@sapudex/web-components 2.9.0 → 2.10.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 (273) hide show
  1. package/bundle.esm.js +1 -0
  2. package/cypress/fixtures/footer-links.ts +32 -33
  3. package/cypress/specs/CountrySelector.cy.tsx +5 -2
  4. package/cypress/specs/FilterMenu.cy.tsx +884 -0
  5. package/cypress/specs/Footer.cy.tsx +10 -11
  6. package/cypress/specs/SocialMediaButton.cy.tsx +44 -0
  7. package/cypress/specs/Table.cy.tsx +8 -2
  8. package/cypress/specs/TextField.cy.tsx +11 -4
  9. package/cypress/support/component-imports.instrumented.ts +11 -1
  10. package/cypress/support/component-imports.src.ts +12 -2
  11. package/dist/Assets.d.ts +1 -0
  12. package/dist/Assets.js +1 -0
  13. package/dist/Assets.js.map +1 -1
  14. package/dist/CountrySelector.d.ts +2 -2
  15. package/dist/CountrySelector.js +6 -3
  16. package/dist/CountrySelector.js.map +1 -1
  17. package/dist/DatePicker.js +2 -2
  18. package/dist/DatePicker.js.map +1 -1
  19. package/dist/FilterMenu.d.ts +13 -2
  20. package/dist/FilterMenu.js +59 -13
  21. package/dist/FilterMenu.js.map +1 -1
  22. package/dist/Footer.d.ts +5 -3
  23. package/dist/Footer.js +3 -5
  24. package/dist/Footer.js.map +1 -1
  25. package/dist/MastheadItem.d.ts +12 -0
  26. package/dist/MastheadItem.js +6 -0
  27. package/dist/MastheadItem.js.map +1 -1
  28. package/dist/MastheadShell.d.ts +13 -3
  29. package/dist/MastheadShell.js +17 -4
  30. package/dist/MastheadShell.js.map +1 -1
  31. package/dist/SelectBox.d.ts +0 -1
  32. package/dist/SelectBox.js +2 -2
  33. package/dist/SelectBox.js.map +1 -1
  34. package/dist/SocialMediaButton.d.ts +73 -0
  35. package/dist/SocialMediaButton.js +135 -0
  36. package/dist/SocialMediaButton.js.map +1 -0
  37. package/dist/SocialMediaButtonTemplate.d.ts +2 -0
  38. package/dist/SocialMediaButtonTemplate.js +6 -0
  39. package/dist/SocialMediaButtonTemplate.js.map +1 -0
  40. package/dist/StepInput.d.ts +2 -1
  41. package/dist/StepInput.js +6 -0
  42. package/dist/StepInput.js.map +1 -1
  43. package/dist/StepInputTemplate.js +1 -1
  44. package/dist/StepInputTemplate.js.map +1 -1
  45. package/dist/TableRow.d.ts +11 -0
  46. package/dist/TableRow.js +16 -0
  47. package/dist/TableRow.js.map +1 -1
  48. package/dist/TextArea.d.ts +3 -8
  49. package/dist/TextArea.js +12 -5
  50. package/dist/TextArea.js.map +1 -1
  51. package/dist/TextField.d.ts +20 -11
  52. package/dist/TextField.js +44 -31
  53. package/dist/TextField.js.map +1 -1
  54. package/dist/assets/{InputSuggestions-BmjyLzkP.js → InputSuggestions-xcV7PZDf.js} +1 -1
  55. package/dist/assets/{ListItemStandardExpandableTextTemplate-CDt3iORy.js → ListItemStandardExpandableTextTemplate-RYCr4pVL.js} +1 -1
  56. package/dist/assets/ar-CUjm9SSI.js +1 -0
  57. package/dist/assets/ar_EG-DQlFzN6x.js +1 -0
  58. package/dist/assets/ar_SA-lp21-ovF.js +1 -0
  59. package/dist/assets/bg-BMgSEqKu.js +1 -0
  60. package/dist/assets/{bundle.esm-Dz11sAJe.js → bundle.esm-bg-64miJ.js} +208 -207
  61. package/dist/assets/ca-BEgqToWu.js +1 -0
  62. package/dist/assets/cnr-IJYa9RjY.js +1 -0
  63. package/dist/assets/cs-DcM44PeB.js +1 -0
  64. package/dist/assets/da-D81rJc1N.js +1 -0
  65. package/dist/assets/de-eQRPkDbn.js +1 -0
  66. package/dist/assets/de_AT-Ag3CVI5m.js +1 -0
  67. package/dist/assets/de_CH-DgRYNg0p.js +1 -0
  68. package/dist/assets/el-W3XNt9Wl.js +1 -0
  69. package/dist/assets/el_CY-BfNIiYpU.js +1 -0
  70. package/dist/assets/en-CrBjXhTl.js +1 -0
  71. package/dist/assets/en_AU-Br7ytKW4.js +1 -0
  72. package/dist/assets/en_GB-DfnNoCgD.js +1 -0
  73. package/dist/assets/en_HK-Cyj9DPsW.js +1 -0
  74. package/dist/assets/en_IE-B5FpEUby.js +1 -0
  75. package/dist/assets/en_IN-C3XmKnWe.js +1 -0
  76. package/dist/assets/en_NZ-COJ5ycaE.js +1 -0
  77. package/dist/assets/en_PG-BB-Cmgcm.js +1 -0
  78. package/dist/assets/en_SG-Dfevg5da.js +1 -0
  79. package/dist/assets/en_ZA-BgOSNy0v.js +1 -0
  80. package/dist/assets/es-CRcVj7aR.js +1 -0
  81. package/dist/assets/es_AR-CFf6aWC5.js +1 -0
  82. package/dist/assets/es_BO-DNFEED1o.js +1 -0
  83. package/dist/assets/es_CL-DZhLyidG.js +1 -0
  84. package/dist/assets/es_CO-uWf-1tom.js +1 -0
  85. package/dist/assets/es_MX-C_wDRcT-.js +1 -0
  86. package/dist/assets/es_PE-QQsdF6EB.js +1 -0
  87. package/dist/assets/es_UY-CWhNSkyr.js +1 -0
  88. package/dist/assets/es_VE-hweLK9Ws.js +1 -0
  89. package/dist/assets/et-B3fco2O5.js +1 -0
  90. package/dist/assets/fa-oRguSKlL.js +1 -0
  91. package/dist/assets/fi-Daa_vlE5.js +1 -0
  92. package/dist/assets/fr-CANfYyyO.js +1 -0
  93. package/dist/assets/fr_BE-CCxD_K6m.js +1 -0
  94. package/dist/assets/fr_CA-BEtkRJZv.js +1 -0
  95. package/dist/assets/fr_CH-CrBmdh_n.js +1 -0
  96. package/dist/assets/fr_LU-CDcjZueC.js +1 -0
  97. package/dist/assets/he-CVUhin6m.js +1 -0
  98. package/dist/assets/hi-DF2PyuOw.js +1 -0
  99. package/dist/assets/hr-b6c4wXpD.js +1 -0
  100. package/dist/assets/hu-B7IWSU6b.js +1 -0
  101. package/dist/assets/id-GxIydI_w.js +1 -0
  102. package/dist/assets/it-DAjzvm2X.js +1 -0
  103. package/dist/assets/it_CH-BvNuHKQK.js +1 -0
  104. package/dist/assets/ja-DhVA6Wxm.js +1 -0
  105. package/dist/assets/kk-BSxmnq67.js +1 -0
  106. package/dist/assets/ko-ZT8Z04Uq.js +1 -0
  107. package/dist/assets/lt-BVWqkFr_.js +1 -0
  108. package/dist/assets/lv-DyXyW37Y.js +1 -0
  109. package/dist/assets/messagebundle_en-BHfPJk-2.js +1 -0
  110. package/dist/assets/mk-ChbdOzZI.js +1 -0
  111. package/dist/assets/ms-H9bJ42GA.js +1 -0
  112. package/dist/assets/nb-Dgkq7ozi.js +1 -0
  113. package/dist/assets/nl-DZqLtAXS.js +1 -0
  114. package/dist/assets/nl_BE-Dx4AxOFo.js +1 -0
  115. package/dist/assets/pl-MzEgIfvm.js +1 -0
  116. package/dist/assets/pt-2N8dosOm.js +1 -0
  117. package/dist/assets/pt_PT-CIcj5FsJ.js +1 -0
  118. package/dist/assets/ro-CZHCJKTk.js +1 -0
  119. package/dist/assets/ru-BcU9rFqC.js +1 -0
  120. package/dist/assets/ru_UA-aH_wNrwj.js +1 -0
  121. package/dist/assets/sk-DYn5gXzA.js +1 -0
  122. package/dist/assets/sl-RYb_KlOx.js +1 -0
  123. package/dist/assets/sr-Bap_3nyz.js +1 -0
  124. package/dist/assets/sr_Latn-FYOU_tQB.js +1 -0
  125. package/dist/assets/sv-CeQXZ1qM.js +1 -0
  126. package/dist/assets/th-C5mRgAid.js +1 -0
  127. package/dist/assets/tr-vCU3KUkO.js +1 -0
  128. package/dist/assets/uk-CKvdHIrD.js +1 -0
  129. package/dist/assets/vi-0BxthtV1.js +1 -0
  130. package/dist/assets/zh_CN-BV9PXZ7J.js +1 -0
  131. package/dist/assets/zh_HK-kGfo3-wS.js +1 -0
  132. package/dist/assets/zh_SG-B8bEKxnm.js +1 -0
  133. package/dist/assets/zh_TW-BshO-JEe.js +1 -0
  134. package/dist/css/themes/DatePicker.css +1 -1
  135. package/dist/css/themes/Dropdown.css +1 -1
  136. package/dist/css/themes/FilterMenu.css +1 -1
  137. package/dist/css/themes/Footer.css +1 -1
  138. package/dist/css/themes/Link.css +1 -1
  139. package/dist/css/themes/MastheadItem.css +1 -1
  140. package/dist/css/themes/MastheadMenu.css +1 -1
  141. package/dist/css/themes/RatingIndicator.css +1 -1
  142. package/dist/css/themes/SelectBox.css +1 -1
  143. package/dist/css/themes/Slider.css +1 -1
  144. package/dist/css/themes/SocialMediaButton.css +1 -0
  145. package/dist/css/themes/TextField.css +1 -1
  146. package/dist/custom-elements-internal.json +214 -6
  147. package/dist/custom-elements.json +205 -6
  148. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  149. package/dist/generated/i18n/i18n-defaults.d.ts +2 -2
  150. package/dist/generated/i18n/i18n-defaults.js +2 -2
  151. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  152. package/dist/generated/templates/CountrySelectorTemplate.lit.js +1 -2
  153. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  154. package/dist/generated/templates/DatePickerTemplate.lit.js +4 -5
  155. package/dist/generated/templates/DatePickerTemplate.lit.js.map +1 -1
  156. package/dist/generated/templates/FilterMenuTemplate.lit.js +2 -2
  157. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  158. package/dist/generated/templates/FooterTemplate.lit.js +1 -1
  159. package/dist/generated/templates/FooterTemplate.lit.js.map +1 -1
  160. package/dist/generated/templates/MastheadItemTemplate.lit.js +3 -3
  161. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  162. package/dist/generated/templates/MastheadShellTemplate.lit.js +1 -1
  163. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  164. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +1 -1
  165. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  166. package/dist/generated/templates/SelectBoxTemplate.lit.js +4 -4
  167. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  168. package/dist/generated/templates/TextFieldTemplate.lit.js +2 -2
  169. package/dist/generated/templates/TextFieldTemplate.lit.js.map +1 -1
  170. package/dist/generated/themes/DatePicker.css.d.ts +1 -1
  171. package/dist/generated/themes/DatePicker.css.js +1 -1
  172. package/dist/generated/themes/DatePicker.css.js.map +1 -1
  173. package/dist/generated/themes/Dropdown.css.d.ts +1 -1
  174. package/dist/generated/themes/Dropdown.css.js +1 -1
  175. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  176. package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
  177. package/dist/generated/themes/FilterMenu.css.js +1 -1
  178. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  179. package/dist/generated/themes/Footer.css.d.ts +1 -1
  180. package/dist/generated/themes/Footer.css.js +1 -1
  181. package/dist/generated/themes/Footer.css.js.map +1 -1
  182. package/dist/generated/themes/Link.css.d.ts +1 -1
  183. package/dist/generated/themes/Link.css.js +1 -1
  184. package/dist/generated/themes/Link.css.js.map +1 -1
  185. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  186. package/dist/generated/themes/MastheadItem.css.js +1 -1
  187. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  188. package/dist/generated/themes/MastheadMenu.css.d.ts +1 -1
  189. package/dist/generated/themes/MastheadMenu.css.js +1 -1
  190. package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
  191. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  192. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  193. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  194. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  195. package/dist/generated/themes/SelectBox.css.js +1 -1
  196. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  197. package/dist/generated/themes/Slider.css.d.ts +1 -1
  198. package/dist/generated/themes/Slider.css.js +1 -1
  199. package/dist/generated/themes/Slider.css.js.map +1 -1
  200. package/dist/generated/themes/SocialMediaButton.css.d.ts +2 -0
  201. package/dist/generated/themes/SocialMediaButton.css.js +8 -0
  202. package/dist/generated/themes/SocialMediaButton.css.js.map +1 -0
  203. package/dist/generated/themes/TextField.css.d.ts +1 -1
  204. package/dist/generated/themes/TextField.css.js +1 -1
  205. package/dist/generated/themes/TextField.css.js.map +1 -1
  206. package/dist/messagebundle.properties +3 -3
  207. package/dist/messagebundle_en.properties +1 -1
  208. package/dist/types/SocialMediaButtonType.d.ts +9 -0
  209. package/dist/types/SocialMediaButtonType.js +11 -0
  210. package/dist/types/SocialMediaButtonType.js.map +1 -0
  211. package/dist/vscode.html-custom-data.json +50 -1
  212. package/dist/web-types.json +112 -7
  213. package/package.json +2 -1
  214. package/src/Assets.ts +1 -0
  215. package/src/CountrySelector.hbs +3 -9
  216. package/src/CountrySelector.ts +7 -4
  217. package/src/DatePicker.hbs +17 -26
  218. package/src/DatePicker.ts +2 -2
  219. package/src/FilterMenu.hbs +33 -37
  220. package/src/FilterMenu.ts +69 -15
  221. package/src/Footer.hbs +7 -14
  222. package/src/Footer.ts +7 -8
  223. package/src/MastheadItem.hbs +2 -2
  224. package/src/MastheadItem.ts +18 -0
  225. package/src/MastheadShell.hbs +3 -2
  226. package/src/MastheadShell.ts +28 -7
  227. package/src/SearchableListBase.hbs +1 -1
  228. package/src/SelectBox.hbs +11 -13
  229. package/src/SelectBox.ts +2 -2
  230. package/src/SocialMediaButton.ts +152 -0
  231. package/src/SocialMediaButtonTemplate.tsx +18 -0
  232. package/src/StepInput.ts +8 -1
  233. package/src/StepInputTemplate.tsx +1 -2
  234. package/src/TableRow.ts +27 -1
  235. package/src/TextArea.ts +14 -7
  236. package/src/TextField.hbs +5 -5
  237. package/src/TextField.ts +87 -66
  238. package/src/generated/i18n/i18n-defaults.ts +2 -2
  239. package/src/generated/templates/CountrySelectorTemplate.lit.ts +1 -2
  240. package/src/generated/templates/DatePickerTemplate.lit.ts +4 -5
  241. package/src/generated/templates/FilterMenuTemplate.lit.ts +2 -2
  242. package/src/generated/templates/FooterTemplate.lit.ts +1 -1
  243. package/src/generated/templates/MastheadItemTemplate.lit.ts +3 -3
  244. package/src/generated/templates/MastheadShellTemplate.lit.ts +1 -1
  245. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +1 -1
  246. package/src/generated/templates/SelectBoxTemplate.lit.ts +4 -4
  247. package/src/generated/templates/TextFieldTemplate.lit.ts +2 -2
  248. package/src/generated/themes/DatePicker.css.ts +1 -1
  249. package/src/generated/themes/Dropdown.css.ts +1 -1
  250. package/src/generated/themes/FilterMenu.css.ts +1 -1
  251. package/src/generated/themes/Footer.css.ts +1 -1
  252. package/src/generated/themes/Link.css.ts +1 -1
  253. package/src/generated/themes/MastheadItem.css.ts +1 -1
  254. package/src/generated/themes/MastheadMenu.css.ts +1 -1
  255. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  256. package/src/generated/themes/SelectBox.css.ts +1 -1
  257. package/src/generated/themes/Slider.css.ts +1 -1
  258. package/src/generated/themes/SocialMediaButton.css.ts +9 -0
  259. package/src/generated/themes/TextField.css.ts +1 -1
  260. package/src/i18n/messagebundle.properties +3 -3
  261. package/src/i18n/messagebundle_en.properties +1 -1
  262. package/src/themes/DatePicker.css +0 -5
  263. package/src/themes/Dropdown.css +1 -1
  264. package/src/themes/FilterMenu.css +2 -2
  265. package/src/themes/Footer.css +0 -16
  266. package/src/themes/Link.css +4 -1
  267. package/src/themes/MastheadItem.css +2 -1
  268. package/src/themes/MastheadMenu.css +4 -4
  269. package/src/themes/SelectBox.css +1 -1
  270. package/src/themes/SocialMediaButton.css +50 -0
  271. package/src/themes/TextField.css +0 -15
  272. package/src/types/SocialMediaButtonType.ts +10 -0
  273. package/dist/assets/messagebundle_en-CKeTZNW3.js +0 -1
package/src/Footer.ts CHANGED
@@ -14,6 +14,8 @@ import UDExButton from "./Button.js";
14
14
  import UDExAccordion from "./Accordion.js";
15
15
  import UDExLink from "./Link.js";
16
16
  import UDExDivider from "./Divider.js";
17
+ import UDExSocialMediaButton from "./SocialMediaButton.js";
18
+ import type { UDExSocialMediaButtonType } from "./types/SocialMediaButtonType.js";
17
19
  import type { UDExTarget } from "./types/common.js";
18
20
  import { BreakpointUtils } from "./utils/Breakpoints.js";
19
21
  import parseArrayFromString from "./utils/parseArrayFromString.js";
@@ -35,7 +37,6 @@ import {
35
37
  QUICK_LINKS,
36
38
  SEE_COMPLETE_LIST,
37
39
  SITE_INFORMATION,
38
- SOCIAL_LINK_ICON,
39
40
  TRENDING,
40
41
  COPYRIGHT,
41
42
  PUBLIC_SECURITY_NETWORK_NUMBER,
@@ -56,9 +57,11 @@ export type FooterLink = {
56
57
  };
57
58
 
58
59
  export type FooterSocialLink = {
60
+ name?: UDExSocialMediaButtonType;
59
61
  url: string;
60
- iconUrl: string;
61
- target: UDExTarget;
62
+ target?: UDExTarget;
63
+ accessibleName?: string;
64
+ id? : string;
62
65
  };
63
66
 
64
67
  export type FooterContactNumber = {
@@ -106,7 +109,7 @@ type DetailedEvents = "quick-links-click" | "trending-click" | "about-sap-click"
106
109
  renderer: litRender,
107
110
  styles: [FooterCss],
108
111
  template: FooterTemplate,
109
- dependencies: [UDExAccordion, UDExAccordionItem, Icon, UDExButton, UDExDivider, UDExLink],
112
+ dependencies: [UDExAccordion, UDExAccordionItem, Icon, UDExButton, UDExDivider, UDExLink, UDExSocialMediaButton],
110
113
  })
111
114
  /**
112
115
  * Triggered on click interaction with logo in footer
@@ -427,10 +430,6 @@ class UDExFooter extends UI5Element {
427
430
  return !!this.contactNumbersArray.length || !!this.contactUsLink || !!this.chatWithUsLink;
428
431
  }
429
432
 
430
- get socialIconAccessibleName(): string {
431
- return ` ${UDExFooter.i18nBundle.getText(SOCIAL_LINK_ICON)}`;
432
- }
433
-
434
433
  get phoneNumberAccessibleName(): string {
435
434
  return `${UDExFooter.i18nBundle.getText(PHONE_NUMBER)} `;
436
435
  }
@@ -64,8 +64,8 @@
64
64
  <ui5-icon
65
65
  class="udex-masthead-item__icon"
66
66
  name="{{icon}}"
67
- show-tooltip="{{iconAlt}}"
68
- accessible-name="{{iconAlt}}"
67
+ show-tooltip="{{iconAltText}}"
68
+ accessible-name="{{iconAltText}}"
69
69
  mode="Decorative">
70
70
  </ui5-icon>
71
71
  {{else if image}}
@@ -285,9 +285,23 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
285
285
  @slot({ type: HTMLElement, "default": true })
286
286
  content?: Array<HTMLElement>;
287
287
 
288
+ /**
289
+ * Defines the prevents the item from losing focus.
290
+ *
291
+ * @private
292
+ */
293
+
288
294
  @property({ type: Boolean })
289
295
  _preventFocusOut!: boolean;
290
296
 
297
+ /**
298
+ * Defines the item is a menu close button
299
+ *
300
+ * @private
301
+ */
302
+ @property({ type: Boolean })
303
+ _isMenuCloseBtn?: boolean;
304
+
291
305
  @i18n("@sapudex/web-components")
292
306
  static i18nBundle: I18nBundle;
293
307
 
@@ -530,6 +544,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
530
544
  return this.querySelector("[udex-avatar]")!;
531
545
  }
532
546
 
547
+ get iconAltText(): string {
548
+ return this._isMenuCloseBtn ? this.accessibleName || this.icon : this.iconAlt;
549
+ }
550
+
533
551
  get isRtlDirection(): boolean {
534
552
  return this._direction === "rtl";
535
553
  }
@@ -121,9 +121,10 @@
121
121
  class="udex-masthead-shell__close-btn"
122
122
  accessible-role="button"
123
123
  icon="decline"
124
- accessible-name="close"
124
+ accessible-name="{{mobileCloseButtonAccessibleName}}"
125
125
  part="menu-close-btn"
126
- hide-active-border>
126
+ hide-active-border
127
+ _is-menu-close-btn>
127
128
  </udex-masthead-item>
128
129
  {{/if}}
129
130
  </div>
@@ -3,6 +3,7 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
5
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
+ import type { ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
6
7
  import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
7
8
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
9
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
@@ -31,7 +32,7 @@ import MastheadShellTemplate from "./generated/templates/MastheadShellTemplate.l
31
32
  // Styles
32
33
  import MastheadShellCss from "./generated/themes/MastheadShell.css.js";
33
34
 
34
- const canvasContentFont = "16px '72 Brand Variable'";
35
+ const canvasContentFont = "14px '72 Brand Variable'";
35
36
  type MastheadSlottedItem = UDExMastheadItem | UDExMastheadProfileMenu | UDExMastheadMenu | UDExMastheadCountrySelector | undefined | null;
36
37
  type MastheadItemType = UDExMastheadItem | null | undefined;
37
38
 
@@ -47,6 +48,7 @@ type UDExMastheadShellAnalyticsNameEventDetail = {
47
48
  }
48
49
 
49
50
  export enum UDExMastheadVariable {
51
+ itemArrowIconMarginInlineStart = "--udex-masthead-item-arrow-margin-inline-start",
50
52
  mobileMenuHeight = "--udex-masthead-shell-mobile-menu-height",
51
53
  itemButtonIconSize = "--udex-masthead-item-button-icon-size",
52
54
  itemArrowIconSize = "--udex-masthead-item-arrow-icon-size",
@@ -283,7 +285,7 @@ class UDExMastheadShell extends UI5Element {
283
285
  /**
284
286
  * Defines overflow style for the body after clicking mobile menu opener button
285
287
  *
286
- * @default ""
288
+ * @default false
287
289
  * @public
288
290
  */
289
291
  @property({ type: Boolean })
@@ -292,7 +294,7 @@ class UDExMastheadShell extends UI5Element {
292
294
  /**
293
295
  * Defines the visibility of the Search by default.
294
296
  *
295
- * @default ""
297
+ * @default false
296
298
  * @public
297
299
  */
298
300
  @property({ type: Boolean })
@@ -301,7 +303,7 @@ class UDExMastheadShell extends UI5Element {
301
303
  /**
302
304
  * Defines sticky position for component
303
305
  *
304
- * @default ""
306
+ * @default false
305
307
  * @public
306
308
  */
307
309
  @property({ type: Boolean })
@@ -406,6 +408,15 @@ class UDExMastheadShell extends UI5Element {
406
408
  @property()
407
409
  closeButtonAccessibleName?: string;
408
410
 
411
+ /**
412
+ * Defines an accessible name for the close mobile menu button
413
+ *
414
+ * @default undefined
415
+ * @public
416
+ */
417
+ @property()
418
+ mobileCloseButtonAccessibleName?: string;
419
+
409
420
  /**
410
421
  * Defines an aria label for the homepage link
411
422
  *
@@ -490,7 +501,9 @@ class UDExMastheadShell extends UI5Element {
490
501
  this.focusSearchBtn();
491
502
  }
492
503
 
493
- this.updateVisibility();
504
+ if (this.shouldHandleMobileView) {
505
+ this.updateVisibility();
506
+ }
494
507
  }
495
508
 
496
509
  onEnterDOM(): void {
@@ -504,6 +517,12 @@ class UDExMastheadShell extends UI5Element {
504
517
  ResizeHandler.deregister(this, this._handleResizeBound);
505
518
  }
506
519
 
520
+ onInvalidation({ name }: ChangeInfo): void {
521
+ if (name === "default" && this.shouldHandleMobileView) {
522
+ this.handleMobileMode();
523
+ }
524
+ }
525
+
507
526
  _handleResize(): void {
508
527
  if (this.shouldHandleMobileView) {
509
528
  this.handleMobileMode();
@@ -762,7 +781,9 @@ class UDExMastheadShell extends UI5Element {
762
781
  }
763
782
 
764
783
  getItemArrowIconWidth(): number {
765
- return this.getItemIconSize(UDExMastheadVariable.itemArrowIconSize);
784
+ const arrowIconSize = this.getItemIconSize(UDExMastheadVariable.itemArrowIconSize);
785
+ const marginInlineStart = this.getItemIconSize(UDExMastheadVariable.itemArrowIconMarginInlineStart);
786
+ return arrowIconSize + marginInlineStart;
766
787
  }
767
788
 
768
789
  getMainMenuWidth(): number {
@@ -772,7 +793,7 @@ class UDExMastheadShell extends UI5Element {
772
793
  const mainItem = item as UDExMastheadItem;
773
794
  const hasArrowIcon = mainItem.hasArrowDown && !mainItem.hideArrowIcon;
774
795
  const arrowIconWidth = hasArrowIcon ? this.getItemArrowIconWidth() : 0;
775
- return accumulatedWidth + this.getItemWidth(mainItem) + (index && parseInt(gapItemVar) + arrowIconWidth);
796
+ return accumulatedWidth + this.getItemWidth(mainItem) + (index && parseInt(gapItemVar)) + arrowIconWidth;
776
797
  }, 0);
777
798
  }
778
799
 
@@ -16,7 +16,7 @@
16
16
  </span>
17
17
  {{/if}}
18
18
  {{#if isListEmpty}}
19
- <div class="udex-no-result"><span>{{getNoResultText}}&lrm;</span></div>
19
+ <div class="udex-no-result"><span>{{getNoResultText}}</span></div>
20
20
  {{else if busy}}
21
21
  <ui5-busy-indicator
22
22
  class="udex-busy-indicator"
package/src/SelectBox.hbs CHANGED
@@ -15,7 +15,6 @@
15
15
  ?displayonly="{{displayonly}}"
16
16
  ?readonly="{{readonly}}"
17
17
  aria-label="{{accInfo.ariaLabel}}"
18
- aria-labelledby="{{accInfo.ariaLabelledBy}}"
19
18
  aria-readonly="{{isReadOrDisplayOnly}}"
20
19
  aria-disabled="{{disabled}}"
21
20
  aria-haspopup="{{listboxRole}}"
@@ -23,16 +22,18 @@
23
22
  aria-expanded="{{tokenizerExpanded}}"
24
23
  aria-activedescendant>
25
24
  {{#if label}}
26
- <span id="{{this._id}}-single-label" class="{{labelClass}}">
27
- {{label}}
28
- {{#if required}}
29
- *
30
- {{/if}}
31
- </span>
25
+ <span class="{{labelClass}}">
26
+ {{label}}
27
+ {{#if required}}
28
+ *
29
+ {{/if}}
30
+ </span>
31
+ <span class="hidden" id="{{this._id}}-single-label">{{accInfo.ariaLabel}}</span>
32
+ </span>
32
33
  {{/if}}
33
34
  {{#if showSingleSelectedOption}}
34
35
  <div class="udex-text-field__text-holder">
35
- <span class="udex-text-field__single-label">
36
+ <span class="udex-text-field__single-label" aria-hidden="true">
36
37
  {{{_singleSelectedOption}}}
37
38
  </span>
38
39
  </div>
@@ -66,15 +67,12 @@
66
67
  aria-expanded="{{accessibilityAttributes.expanded}}"
67
68
  aria-controls="{{accessibilityAttributes.controls}}"
68
69
  aria-haspopup="{{accessibilityAttributes.hasPopup}}"
69
- aria-label="{{accessibilityAttributes.ariaLabel}}"
70
70
  class="udex-text-field__trigger"
71
71
  tabindex="{{triggerTabIndex}}"
72
72
  @keydown="{{handleKeyDownTrigger}}"
73
73
  @click="{{getHandleMultiSelectOpen}}">
74
- <ui5-icon
75
- name="navigation-down-arrow"
76
- accessible-name="{{iconAccessibleNameText}}">
77
- </ui5-icon>
74
+ <ui5-icon name="navigation-down-arrow"></ui5-icon>
75
+ <span class="hidden">{{accessibilityAttributes.ariaLabel}}</span>
78
76
  </button>
79
77
  {{/if}}
80
78
  </div>
package/src/SelectBox.ts CHANGED
@@ -23,6 +23,7 @@ import Icon from "@ui5/webcomponents/dist/Icon.js";
23
23
  import Token from "@ui5/webcomponents/dist/Token.js";
24
24
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
25
25
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
26
+ import { getAllAccessibleNameRefTexts } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
26
27
  import Popover from "@ui5/webcomponents/dist/Popover.js";
27
28
  import UDExList from "./List.js";
28
29
  import UDExListItem from "./ListItem.js";
@@ -713,8 +714,7 @@ class UDExSelectBox extends UDExSearchableListBase {
713
714
 
714
715
  get accInfo() {
715
716
  return {
716
- "ariaLabel": this.accessibleName || this.label || undefined,
717
- "ariaLabelledBy": this.accessibleNameRef || undefined,
717
+ "ariaLabel": getAllAccessibleNameRefTexts(this) || this.accessibleName || this.label || undefined,
718
718
  };
719
719
  }
720
720
 
@@ -0,0 +1,152 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
+ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
5
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
6
+ import SocialMediaButtonTemplate from "./SocialMediaButtonTemplate.js";
7
+ import UDExSocialMediaButtonType from "./types/SocialMediaButtonType.js";
8
+ import type { LinkClickEventDetail } from "@ui5/webcomponents/dist/Link.js";
9
+ import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
10
+ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
11
+ import { SOCIAL_MEDIA_BUTTON } from "./generated/i18n/i18n-defaults.js";
12
+ import { UDExTarget } from "./types/common.js";
13
+
14
+ // Styles
15
+ import SocialMediaButtonCss from "./generated/themes/SocialMediaButton.css.js";
16
+
17
+ const baseIconsURL = "https://cdn.udex.services.sap.com/dds/design-tokens/assets/icons/";
18
+
19
+ /**
20
+ * @class
21
+ *
22
+ * <h3 class="comment-api-title">Overview</h3>
23
+ *
24
+ *
25
+ * <h3>Usage</h3>
26
+ *
27
+ * For the <code>udex-social-media-button</code>
28
+ * <h3>ES6 Module Import</h3>
29
+ *
30
+ * <code>import "@sapudex/web-components/dist/SocialMediaButton.js";</code>
31
+ *
32
+ * @constructor
33
+ * @extends UI5Element
34
+ * @tagname udex-social-media-button
35
+ * @public
36
+ */
37
+ @customElement({
38
+ tag: "udex-social-media-button",
39
+ renderer: jsxRenderer,
40
+ styles: SocialMediaButtonCss,
41
+ template: SocialMediaButtonTemplate,
42
+ })
43
+
44
+ /**
45
+ * Triggered when the user clicks on an item.
46
+ * @public
47
+ */
48
+ @event("click", { cancelable: true, bubbles: true })
49
+
50
+ class UDExSocialMediaButton extends UI5Element {
51
+ eventDetails!: {
52
+ "click": LinkClickEventDetail,
53
+ };
54
+
55
+ /**
56
+ * Defines the type of Social Media Button.
57
+ * <br><br>
58
+ * Available options are:
59
+ * <ul>
60
+ * <li><code>facebook</code> - the button with Facebook icon</li>
61
+ * <li><code>instagram</code> - the button with Instagram icon</li>
62
+ * <li><code>linkedin</code> - the button with LinkedIn icon</li>
63
+ * <li><code>youtube</code> - the button with YouTube icon</li>
64
+ * <li><code>x</code> - the button with X icon</li>
65
+ * <li><code>mail</code> - the button with Instagram mail icon (default)</li>
66
+ * </ul>
67
+ *
68
+ * @public
69
+ */
70
+ @property()
71
+ type: `${UDExSocialMediaButtonType}` = UDExSocialMediaButtonType.email;
72
+
73
+ /**
74
+ * Defines the URL address for Social Media platform profile.
75
+ *
76
+ * @default ""
77
+ * @public
78
+ */
79
+ @property({ type: String })
80
+ url?: string;
81
+
82
+ /**
83
+ * Define the target of the Social Media Button link
84
+ * <b>Note:</b> Standard hyperlink behavior is supported.
85
+ * @public
86
+ * @default "_blank"
87
+ */
88
+ @property({ type: String })
89
+ target: `${UDExTarget}` = UDExTarget._blank;
90
+
91
+ /**
92
+ * Defines the accessible ARIA name of the component.
93
+ *
94
+ * @default "Social Media Button"
95
+ * @public
96
+ */
97
+ @property({ type: String })
98
+ accessibleName?: string;
99
+
100
+ @i18n("@sapudex/web-components")
101
+ static i18nBundle: I18nBundle;
102
+
103
+ private svgLoaded: boolean = false;
104
+
105
+ fireLinkClickEvent(e: CustomEvent<LinkClickEventDetail>): void {
106
+ const executeEvent = this.fireDecoratorEvent("click", e.detail);
107
+
108
+ if (!executeEvent) {
109
+ e.preventDefault();
110
+ }
111
+ }
112
+
113
+ onAfterRendering(): void {
114
+ this.fetchIconSvg();
115
+ }
116
+
117
+ async fetchIconSvg() {
118
+ if (this.svgLoaded) {
119
+ return;
120
+ }
121
+
122
+ try {
123
+ const response = await fetch(`${baseIconsURL}${this.type}.svg`);
124
+
125
+ if (!response.ok) {
126
+ console.warn("Failed to fetch SVG", response.statusText);
127
+ return;
128
+ }
129
+
130
+ const svgContent: string = await response.text();
131
+ this.updateSvgContent(svgContent);
132
+ } catch (error) {
133
+ console.warn("Failed to fetch SVG", error);
134
+ }
135
+ }
136
+
137
+ private updateSvgContent(svgContent: string): void {
138
+ const socialBtnEl = this.shadowRoot?.querySelector(".udex-social-media-button");
139
+ if (socialBtnEl) {
140
+ socialBtnEl.innerHTML = svgContent;
141
+ this.svgLoaded = true;
142
+ }
143
+ }
144
+
145
+ get buttonAccessibleName(): string {
146
+ return this.accessibleName || UDExSocialMediaButton.i18nBundle.getText(SOCIAL_MEDIA_BUTTON);
147
+ }
148
+ }
149
+
150
+ UDExSocialMediaButton.define();
151
+
152
+ export default UDExSocialMediaButton;
@@ -0,0 +1,18 @@
1
+ import type UDExSocialMediaButton from "./SocialMediaButton.js";
2
+ import UDExLink from "./Link.js";
3
+
4
+ export default function SocialMediaButtonTemplate(this: UDExSocialMediaButton) {
5
+ return (
6
+ <div
7
+ class="udex-social-media-button-wrapper">
8
+ <UDExLink
9
+ href={this.url}
10
+ target={this.target}
11
+ accessible-name={this.buttonAccessibleName}
12
+ onClick={this.fireLinkClickEvent}>
13
+ <div class={`udex-social-media-button udex-social-media-button-${this.type}`} title={this.buttonAccessibleName}></div>
14
+ <div class="hidden">{this.buttonAccessibleName}</div>
15
+ </UDExLink>
16
+ </div>
17
+ );
18
+ }
package/src/StepInput.ts CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  isUpShift,
21
21
  isUpShiftCtrl,
22
22
  } from "@ui5/webcomponents-base/dist/Keys.js";
23
+ import { getAllAccessibleNameRefTexts } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
23
24
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
24
25
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
25
26
  import { STEPINPUT_DEC_ICON_TITLE, STEPINPUT_INC_ICON_TITLE } from "./generated/i18n/i18n-defaults.js";
@@ -29,7 +30,7 @@ import StepInputTemplate from "./StepInputTemplate.js";
29
30
  // Styles
30
31
  import StepInputCss from "./generated/themes/StepInput.css.js";
31
32
  import type UDExControlButtonDesign from "./types/ControlButtonDesign.js";
32
- import type { UDExTextFieldKeydownEventDetail } from "./TextField.js";
33
+ import type { AccInfo, UDExTextFieldKeydownEventDetail } from "./TextField.js";
33
34
 
34
35
  // Spin variables
35
36
  const INITIAL_WAIT_TIMEOUT = 500; // milliseconds
@@ -255,6 +256,12 @@ class UDExStepInput extends UI5Element {
255
256
  super();
256
257
  }
257
258
 
259
+ get accInfo(): AccInfo {
260
+ return {
261
+ "ariaLabel": getAllAccessibleNameRefTexts(this) || this.accessibleName || undefined,
262
+ };
263
+ }
264
+
258
265
  get controlButtonDesign(): UDExControlButtonDesign {
259
266
  return valueStateToControlButtonDesign[this.valueState];
260
267
  }
@@ -9,8 +9,7 @@ export default function StepInputTemplate(this: UDExStepInput) {
9
9
  label={this.label}
10
10
  supporting-text={this.supportingText}
11
11
  value={this._valuePrecisioned}
12
- aria-label={this.accessibleName}
13
- aria-labelledby={this.accessibleNameRef}
12
+ aria-label={this.accInfo.ariaLabel}
14
13
  onFocusIn={this._onInputFocusIn}
15
14
  onFocusOut={this._onInputFocusOut}
16
15
  onKeydown={this._onkeydown}
package/src/TableRow.ts CHANGED
@@ -2,6 +2,7 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import UDExTableRowBase from "./TableRowBase.js";
5
+ import type UDExTableCell from "./TableCell.js";
5
6
  import TableRowTemplate from "./generated/templates/TableRowTemplate.lit.js";
6
7
 
7
8
  /**
@@ -39,9 +40,34 @@ class UDExTableRow extends UDExTableRowBase {
39
40
  @property({ type: Boolean })
40
41
  interactive?: boolean;
41
42
 
42
- get isGroup() {
43
+ /**
44
+ * Defines highlighted the row.
45
+ *
46
+ * @default false
47
+ * @public
48
+ */
49
+ @property({ type: Boolean })
50
+ highlighted?: boolean;
51
+
52
+ onBeforeRendering(): void {
53
+ if (this.highlighted) {
54
+ this._setHighlightToCells();
55
+ }
56
+ }
57
+
58
+ _setHighlightToCells(): void {
59
+ this.cellsInRow.forEach(cell => {
60
+ cell._highlighted = true;
61
+ });
62
+ }
63
+
64
+ get isGroup(): boolean {
43
65
  return false;
44
66
  }
67
+
68
+ get cellsInRow(): Array<UDExTableCell> {
69
+ return this.getSlottedNodes<UDExTableCell>("cells");
70
+ }
45
71
  }
46
72
 
47
73
  UDExTableRow.define();
package/src/TextArea.ts CHANGED
@@ -4,6 +4,7 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
5
5
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
6
6
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
7
+ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
7
8
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
9
  import {
9
10
  READ_ONLY,
@@ -44,6 +45,12 @@ import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
44
45
  dependencies: [UDExStatusMessage],
45
46
  })
46
47
 
48
+ /**
49
+ * Fires when the value of the textarea changes and the textarea loses focus.
50
+ * @public
51
+ */
52
+ @event("change", { bubbles: true })
53
+
47
54
  class UDExTextArea extends UI5Element {
48
55
  eventDetails!: {
49
56
  "change": void,
@@ -236,10 +243,6 @@ class UDExTextArea extends UI5Element {
236
243
  @i18n("@sapudex/web-components")
237
244
  static i18nBundle: I18nBundle;
238
245
 
239
- getInputDomRef() {
240
- return this.getDomRef()!.querySelector<HTMLTextAreaElement>("textarea")!;
241
- }
242
-
243
246
  onBeforeRendering() {
244
247
  if (this.value && this.labelActiveClass === "") {
245
248
  this.labelActiveClass = this._labelActiveClassName;
@@ -254,8 +257,8 @@ class UDExTextArea extends UI5Element {
254
257
  this.handleGrowing();
255
258
  }
256
259
 
257
- handleInput = (event: InputEvent) => {
258
- this.value = (event.target as HTMLInputElement)?.value;
260
+ handleInput = (inputEvent: InputEvent) => {
261
+ this.value = (inputEvent.target as HTMLInputElement)?.value;
259
262
  };
260
263
 
261
264
  handleChange = () => {
@@ -313,6 +316,10 @@ class UDExTextArea extends UI5Element {
313
316
  this.active = false;
314
317
  };
315
318
 
319
+ getInputDomRef(): HTMLTextAreaElement {
320
+ return this.getDomRef()!.querySelector<HTMLTextAreaElement>("textarea")!;
321
+ }
322
+
316
323
  get ariaInvalid(): string | null {
317
324
  return this.valueState === UDExValueState.Error ? "true" : null;
318
325
  }
@@ -321,7 +328,7 @@ class UDExTextArea extends UI5Element {
321
328
  return this.valueState === UDExValueState.Error || this.valueState === UDExValueState.Warning || this.valueState === UDExValueState.Success;
322
329
  }
323
330
 
324
- get valueStateTypeMappings() {
331
+ get valueStateTypeMappings(): Record<UDExValueState, string> {
325
332
  return {
326
333
  [UDExValueState.Success]: UDExTextArea.i18nBundle.getText(VALUE_STATE_TYPE_SUCCESS),
327
334
  [UDExValueState.Standard]: UDExTextArea.i18nBundle.getText(VALUE_STATE_TYPE_STANDARD),
package/src/TextField.hbs CHANGED
@@ -31,28 +31,28 @@
31
31
  aria-describedby="{{accInfo.ariaDescribedBy}}"
32
32
  aria-haspopup="{{accInfo.ariaHasPopup}}"
33
33
  aria-label="{{accInfo.ariaLabel}}"
34
- aria-labelledby="{{accInfo.ariaLabelledBy}}"
35
34
  part="textfield-input"
36
35
  min="{{min}}"
37
36
  max="{{max}}"
38
37
  step="{{step}}"
39
38
  />
40
-
41
39
  {{#if icon}}
42
40
  <udex-control-button
43
- accessible-name="{{accessibleIconName}}"
41
+ accessible-name="{{buttonAccessibleName}}"
42
+ accessible-description="{{buttonAccessibleDescription}}"
44
43
  tooltip="{{showButtonTooltip}}"
45
44
  ?active="{{active}}"
46
45
  ?disabled="{{disabled}}"
47
46
  ?readonly="{{readonly}}"
47
+ ?_is-combobox-role="{{_isComboboxRole}}"
48
48
  ?non-interactive="{{readonly}}"
49
49
  design="{{valueState}}"
50
50
  icon="{{icon}}"
51
51
  @click="{{handleIconClick}}"
52
52
  part="textfield-control-btn"
53
53
  size="Large"
54
- class="udex-text-field_icon-container"
55
- ></udex-control-button>
54
+ class="udex-text-field_icon-container">
55
+ </udex-control-button>
56
56
  {{/if}}
57
57
  </div>
58
58