@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
@@ -0,0 +1,410 @@
1
+ import IconMode from "@ui5/webcomponents/dist/types/IconMode.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+ import UI5LinkDesign from "@ui5/webcomponents/dist/types/LinkDesign.js";
4
+
5
+ import headset from "@ui5/webcomponents-icons/dist/headset.js";
6
+ import email from "@ui5/webcomponents-icons/dist/email.js";
7
+ import backToTop from "@ui5/webcomponents-icons/dist/back-to-top.js";
8
+ import discussion from "@ui5/webcomponents-icons/dist/discussion-2.js";
9
+
10
+ import type Footer from "./Footer.js";
11
+ import UDExLink from "./Link.js";
12
+ import UDExDivider from "./Divider.js";
13
+ import UDExSocialMediaButton from "./SocialMediaButton.js";
14
+ import UDExAccordion from "./Accordion.js";
15
+ import UDExAccordionItem from "./AccordionItem.js";
16
+ import UDExButton from "./Button.js";
17
+ import UDExButtonDesign from "./types/ButtonDesign.js";
18
+ import UDExButtonSize from "./types/ButtonSize.js";
19
+
20
+ export default function FooterTemplate(this: Footer) {
21
+ const rootClass = "udex-footer";
22
+
23
+ return (
24
+ <footer className={rootClass}>
25
+ <div className={`${rootClass}__content`}>
26
+ <div className={`${rootClass}__contact-social`}>
27
+ {this.hasLogo && (
28
+ <div className={`${rootClass}__logo`}>
29
+ {this.hasLogoLink ? (
30
+ <a
31
+ href={this.logoHref}
32
+ onClick={this._onLogoClick}
33
+ title={this.logoTitle}
34
+ aria-label={this.logoAriaLabel}>
35
+ <img
36
+ id={`${rootClass}__logo-image`}
37
+ src={this.currentLogoUrl}
38
+ className={this.logoClass}
39
+ alt={this.logoAlt}
40
+ />
41
+ </a>
42
+ ) : (
43
+ <img
44
+ id={`${rootClass}__logo-image`}
45
+ src={this.currentLogoUrl}
46
+ className={this.logoClass}
47
+ alt={this.logoAlt}
48
+ />
49
+ )}
50
+ {this.hasTagline && (
51
+ <img
52
+ id={`${rootClass}__tagline-image`}
53
+ src={this.currentTaglineUrl}
54
+ className={this.taglineClass}
55
+ alt={this.taglineAlt}
56
+ />
57
+ )}
58
+ </div>
59
+ )}
60
+ {this.isContactContainerVisible && (
61
+ <div className={`${rootClass}__contact`}>
62
+ {this.contactNumbersArray.length > 0 && (
63
+ <div className={`${rootClass}__numbers`}>
64
+ <div className={`${rootClass}__icon-container`}>
65
+ <UI5Icon
66
+ class={`${rootClass}__icon`}
67
+ name={headset}
68
+ mode={IconMode.Decorative}
69
+ ></UI5Icon>
70
+ </div>
71
+ <div>
72
+ <div className={`${rootClass}__numbers-wrapper`}>
73
+ {this.contactNumbersArray.map((contact, index) => (
74
+ <div key={index}>
75
+ <span
76
+ className="hidden"
77
+ aria-hidden
78
+ id={`${rootClass}__${index}_phone-label`}>
79
+ {`${this.phoneNumberAccessibleName} ${contact.country} : ${contact.number}`}
80
+ </span>
81
+ <p className={`${rootClass}__country`}>{contact.country}</p>
82
+ <a
83
+ href={`tel:${contact.number}`}
84
+ className={`${rootClass}__number`}
85
+ onClick={this._onContactPhoneClick}
86
+ aria-labelledby={`${rootClass}__${index}_phone-label`}>
87
+ {contact.number}
88
+ </a>
89
+ </div>
90
+ ))}
91
+ </div>
92
+ {this.localCountryNumbersLink && (
93
+ <p className={`${rootClass}__remark`}>
94
+ {this.completeListTitle}
95
+ <UDExLink
96
+ class={`${rootClass}__remark-link`}
97
+ onClick={this._onContactPhoneLocalNumbersClick}
98
+ href={this.localCountryNumbersLink}
99
+ design={UI5LinkDesign.Subtle}>
100
+ {this.localCountryTitle}.
101
+ </UDExLink>
102
+ </p>
103
+ )}
104
+ </div>
105
+ </div>
106
+ )}
107
+ {this.contactUsLink && (
108
+ <div className={`${rootClass}__contact-us`}>
109
+ <div className={`${rootClass}__icon-container`}>
110
+ <UI5Icon
111
+ class={`${rootClass}__icon`}
112
+ name={email}
113
+ mode={IconMode.Decorative}>
114
+ </UI5Icon>
115
+ </div>
116
+ <span
117
+ className="hidden"
118
+ aria-hidden
119
+ id={`${rootClass}__contact-us-label`}>
120
+ {this.contactUsAccessibleLabel}
121
+ </span>
122
+ <a
123
+ href={this.contactUsLink}
124
+ className={`${rootClass}__contact-us-link`}
125
+ aria-labelledby={`${rootClass}__contact-us-label`}
126
+ onClick={this._onContactEmailClick}>
127
+ {this.contactUsAccessibleName}
128
+ </a>
129
+ </div>
130
+ )}
131
+ {this.chatWithUsLink && (
132
+ <div className={`${rootClass}__chat-with-us`}>
133
+ <div className={`${rootClass}__icon-container`}>
134
+ <UI5Icon
135
+ class={`${rootClass}__icon`}
136
+ name={discussion}
137
+ mode={IconMode.Decorative}>
138
+ </UI5Icon>
139
+ </div>
140
+ <a
141
+ href={this.chatWithUsLink}
142
+ className={`${rootClass}__chat-with-us-link`}
143
+ onClick={this._onContactChatClick}>
144
+ {this.chatWithUsAccessibleName}
145
+ </a>
146
+ </div>
147
+ )}
148
+ </div>
149
+ )}
150
+ </div>
151
+
152
+ {this.isContactContainerVisible && (
153
+ <UDExDivider class={`${rootClass}__divider`}></UDExDivider>
154
+ )}
155
+
156
+ {this._shouldRenderMobileMenu ? (
157
+ mobileNavigation.call(this, rootClass)
158
+ ) : (
159
+ desktopNavigation.call(this, rootClass)
160
+ )}
161
+
162
+ <UDExDivider class={`${rootClass}__divider`}></UDExDivider>
163
+ </div>
164
+
165
+ <div className={`${rootClass}__copyright`}>
166
+ {this.isChineseLang && (
167
+ <span className={`${rootClass}__copyright-chinese-text`}>
168
+ <a
169
+ href={this.chineseIcpNumberLink}
170
+ title={this.chineseICPNumber}
171
+ className={`${rootClass}__copyright-chinese-link`}
172
+ target="_blank"
173
+ rel="noopener noreferrer">
174
+ {this.chineseICPNumber}
175
+ </a>
176
+ {this.chineseSecurityNetworkNumber}
177
+ </span>
178
+ )}
179
+ <span className={`${rootClass}__copyright-text`}>{this.copyrightText}</span>
180
+ </div>
181
+
182
+ {this.socialLinksArray.length > 0 && (
183
+ <div className={`${rootClass}__social-container`}>
184
+ {this.socialLinksArray.map((social, index) => (
185
+ <UDExSocialMediaButton
186
+ key={index}
187
+ type={social.name}
188
+ url={social.url}
189
+ target={social.target}
190
+ accessible-name={social.accessibleName}
191
+ data-name={social.name}
192
+ data-id={social.id}
193
+ onui5-click={this._onSocialMediaLinkClick}>
194
+ </UDExSocialMediaButton>
195
+ ))}
196
+ </div>
197
+ )}
198
+
199
+ <UDExButton
200
+ class={`${rootClass}__back-to-top-button`}
201
+ icon={backToTop}
202
+ onClick={this.onBackToTopClick}
203
+ design={UDExButtonDesign.Tertiary}
204
+ size={UDExButtonSize.Large}
205
+ accessibleName="back to top">
206
+ </UDExButton>
207
+ </footer>
208
+ );
209
+ }
210
+
211
+ function mobileNavigation(this: Footer, rootClass: string) {
212
+ return (
213
+ <UDExAccordion class={`${rootClass}__accordion`}>
214
+ {this.quickLinksArray.length > 0 && (
215
+ <>
216
+ <UDExAccordionItem label={this._quickLinksTitle} class={`${rootClass}__action-item`}>
217
+ <ul className={`${rootClass}__links-list udex-footer__links-list--mobile`}>
218
+ {this.quickLinksArray.map((link, index) => (
219
+ <li key={index}>
220
+ <a
221
+ target={link.target}
222
+ aria-describedby={`${rootClass}__quick-links`}
223
+ href={link.url}
224
+ data-id={link.id}
225
+ onClick={this._onQuickLinksClick}>
226
+ {link.title}
227
+ </a>
228
+ </li>
229
+ ))}
230
+ </ul>
231
+ <h3 className={`${rootClass}__links-item hidden`} aria-hidden="true" id={`${rootClass}__quick-links`}>
232
+ {this._quickLinksTitle}
233
+ </h3>
234
+ </UDExAccordionItem>
235
+ </>
236
+ )}
237
+
238
+ {this.trendingLinksArray.length > 0 && (
239
+ <>
240
+ <UDExAccordionItem label={this._trendingTitle} class={`${rootClass}__action-item`}>
241
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--mobile`}>
242
+ {this.trendingLinksArray.map((link, index) => (
243
+ <li key={index}>
244
+ <a
245
+ target={link.target}
246
+ aria-describedby={`${rootClass}__footer__trending`}
247
+ href={link.url}
248
+ data-id={link.id}
249
+ onClick={this._onTrendingClick}>
250
+ {link.title}
251
+ </a>
252
+ </li>
253
+ ))}
254
+ </ul>
255
+ <h3 className={`${rootClass}__links-item hidden`} aria-hidden="true" id={`${rootClass}__trending`}>
256
+ {this._trendingTitle}
257
+ </h3>
258
+ </UDExAccordionItem>
259
+ </>
260
+ )}
261
+
262
+ {this.aboutLinksArray.length > 0 && (
263
+ <>
264
+ <UDExAccordionItem label={this._aboutSapTitle} class={`${rootClass}__action-item`}>
265
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--mobile`}>
266
+ {this.aboutLinksArray.map((link, index) => (
267
+ <li key={index}>
268
+ <a
269
+ target={link.target}
270
+ aria-describedby={`${rootClass}__about`}
271
+ href={link.url}
272
+ data-id={link.id}
273
+ onClick={this._onAboutSapClick}>
274
+ {link.title}
275
+ </a>
276
+ </li>
277
+ ))}
278
+ </ul>
279
+ <h3 className={`${rootClass}__links-item hidden`} aria-hidden="true" id={`${rootClass}__about`}>
280
+ {this._aboutSapTitle}
281
+ </h3>
282
+ </UDExAccordionItem>
283
+ </>
284
+ )}
285
+
286
+ {this.siteInformationLinksArray.length > 0 && (
287
+ <>
288
+ <UDExAccordionItem label={this._siteInformationTitle} class={`${rootClass}__action-item`}>
289
+ <ul className={`${rootClass}__links-list rootClass__links-list--mobile`}>
290
+ {this.siteInformationLinksArray.map((link, index) => (
291
+ <li key={index}>
292
+ <a
293
+ target={link.target}
294
+ aria-describedby={`${rootClass}__site-information`}
295
+ href={link.url}
296
+ data-id={link.id}
297
+ onClick={this._onSiteInformationClick}>
298
+ {link.title}
299
+ </a>
300
+ </li>
301
+ ))}
302
+ </ul>
303
+ <h3 className={`${rootClass}__links-item hidden`} aria-hidden="true" id={`${rootClass}__site-information`}>
304
+ {this._siteInformationTitle}
305
+ </h3>
306
+ </UDExAccordionItem>
307
+ </>
308
+ )}
309
+ </UDExAccordion>
310
+ );
311
+ }
312
+
313
+ function desktopNavigation(this: Footer, rootClass: string) {
314
+ return (
315
+ <div className={`${rootClass}__links`}>
316
+ {this.quickLinksArray.length > 0 && (
317
+ <div className={`${rootClass}__links-group ${rootClass}__quick-links`}>
318
+ <h3 className={`${rootClass}__links-item`} id={`${rootClass}__quick-links`}>
319
+ {this._quickLinksTitle}
320
+ </h3>
321
+ <nav aria-labelledby={`${rootClass}__quick-links`}>
322
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--desktop`}>
323
+ {this.quickLinksArray.map((link, index) => (
324
+ <li key={index}>
325
+ <a
326
+ target={link.target}
327
+ aria-describedby={`${rootClass}__quick-links`}
328
+ data-id={link.id}
329
+ href={link.url}
330
+ onClick={this._onQuickLinksClick}>
331
+ {link.title}
332
+ </a>
333
+ </li>
334
+ ))}
335
+ </ul>
336
+ </nav>
337
+ </div>
338
+ )}
339
+ {this.trendingLinksArray.length > 0 && (
340
+ <div className={`${rootClass}__links-group ${rootClass}__trending-links`}>
341
+ <h3 className={`${rootClass}__links-item`} id={`${rootClass}__trending`}>
342
+ {this._trendingTitle}
343
+ </h3>
344
+ <nav aria-labelledby={`${rootClass}__trending`}>
345
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--desktop`}>
346
+ {this.trendingLinksArray.map((link, index) => (
347
+ <li key={index}>
348
+ <a
349
+ target={link.target}
350
+ aria-describedby={`${rootClass}__footer__trending`}
351
+ data-id={link.id}
352
+ href={link.url}
353
+ onClick={this._onTrendingClick}>
354
+ {link.title}
355
+ </a>
356
+ </li>
357
+ ))}
358
+ </ul>
359
+ </nav>
360
+ </div>
361
+ )}
362
+ {this.aboutLinksArray.length > 0 && (
363
+ <div className={`${rootClass}__links-group ${rootClass}__about-links`}>
364
+ <h3 className={`${rootClass}__links-item`} id={`${rootClass}__about`}>
365
+ {this._aboutSapTitle}
366
+ </h3>
367
+ <nav aria-labelledby={`${rootClass}__about`}>
368
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--desktop`}>
369
+ {this.aboutLinksArray.map((link, index) => (
370
+ <li key={index}>
371
+ <a
372
+ target={link.target}
373
+ aria-describedby={`${rootClass}__about`}
374
+ data-id={link.id}
375
+ href={link.url}
376
+ onClick={this._onAboutSapClick}>
377
+ {link.title}
378
+ </a>
379
+ </li>
380
+ ))}
381
+ </ul>
382
+ </nav>
383
+ </div>
384
+ )}
385
+ {this.siteInformationLinksArray.length > 0 && (
386
+ <div className={`${rootClass}__links-group ${rootClass}__site-information-links`}>
387
+ <h3 className={`${rootClass}__links-item`} id={`${rootClass}__site-information`}>
388
+ {this._siteInformationTitle}
389
+ </h3>
390
+ <nav aria-labelledby={`${rootClass}__site-information`}>
391
+ <ul className={`${rootClass}__links-list ${rootClass}__links-list--desktop`}>
392
+ {this.siteInformationLinksArray.map((link, index) => (
393
+ <li key={index}>
394
+ <a
395
+ target={link.target}
396
+ aria-describedby={`${rootClass}__site-information`}
397
+ data-id={link.id}
398
+ href={link.url}
399
+ onClick={this._onSiteInformationClick}>
400
+ {link.title}
401
+ </a>
402
+ </li>
403
+ ))}
404
+ </ul>
405
+ </nav>
406
+ </div>
407
+ )}
408
+ </div>
409
+ );
410
+ }
package/src/HeroBanner.ts CHANGED
@@ -2,12 +2,12 @@ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
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
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
5
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
6
6
  import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
7
7
  import Icon from "@ui5/webcomponents/dist/Icon.js";
8
8
  import "@ui5/webcomponents-icons/dist/media-play.js";
9
9
  import "@ui5/webcomponents-icons/dist/media-pause.js";
10
- import HeroBannerTemplate from "./generated/templates/HeroBannerTemplate.lit.js";
10
+ import HeroBannerTemplate from "./HeroBannerTemplate.js";
11
11
 
12
12
  // Styles
13
13
  import HeroBannerCss from "./generated/themes/HeroBanner.css.js";
@@ -27,7 +27,7 @@ export enum UDExImageLoadingStrategies {
27
27
  */
28
28
  @customElement({
29
29
  tag: "udex-hero-banner",
30
- renderer: litRender,
30
+ renderer: jsxRenderer,
31
31
  styles: HeroBannerCss,
32
32
  template: HeroBannerTemplate,
33
33
  dependencies: [Icon],
@@ -148,7 +148,7 @@ class UDExHeroBanner extends UI5Element {
148
148
  }
149
149
 
150
150
  get wrapperBackgroundImage(): string {
151
- return this.backgroundGradient ? `background-image:${this.backgroundGradient}` : "";
151
+ return this.backgroundGradient ? this.backgroundGradient : "";
152
152
  }
153
153
 
154
154
  /**
@@ -0,0 +1,101 @@
1
+ import type HeroBanner from "./HeroBanner.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+
4
+ export default function HeroBannerTemplate(this: HeroBanner) {
5
+ const rootClass = "udex-hero-banner";
6
+
7
+ return (
8
+ <div
9
+ className={this.heroBannerClasses}
10
+ part="wrapper"
11
+ style={{
12
+ backgroundColor: this.wrapperBackgroundColor,
13
+ ...(this.wrapperBackgroundImage ? { backgroundImage: this.wrapperBackgroundImage } : {})
14
+ }}>
15
+ {this.hasBackgroundVideo ? (
16
+ <div
17
+ className={`${rootClass}__background-video-wrapper`}
18
+ tabIndex={0}
19
+ onKeyDown={this._handleKeydown}>
20
+ <video
21
+ autoPlay={this.shouldVideoAutoplay}
22
+ muted
23
+ loop
24
+ playsInline
25
+ part="background-video"
26
+ className={`${rootClass}__background-video`}
27
+ aria-label={this.backgroundVideoLabel}>
28
+ <source src={this.backgroundVideo} type="video/mp4" />
29
+ </video>
30
+ <div className={`${rootClass}__background-video-overlay`}></div>
31
+ {this.hasBackgroundImage && (
32
+ <picture>
33
+ <img
34
+ loading={this.backgroundImageLoadingStrategy}
35
+ src={this.backgroundImage}
36
+ part="background-image"
37
+ className={`${rootClass}__background-image`}
38
+ alt={this.backgroundImageLabel}/>
39
+ </picture>
40
+ )}
41
+ <div className={`${rootClass}__content-container`}>
42
+ <slot
43
+ id={`${rootClass}__content`}
44
+ name="content"
45
+ part="content">
46
+ </slot>
47
+ <slot
48
+ id={`${rootClass}__additionalContent`}
49
+ name="additionalContent"
50
+ part="additionalContent">
51
+ </slot>
52
+ </div>
53
+ <button
54
+ className={`${rootClass}__media-button`}
55
+ aria-label="Play / Pause button"
56
+ role="button"
57
+ onClick={this._toggleMediaButton}>
58
+ <UI5Icon name={this.mediaButtonIconName}></UI5Icon>
59
+ </button>
60
+ </div>
61
+ ) : (
62
+ <div className={`${rootClass}__container`}>
63
+ {this.hasCustomBackgroundPicture ? (
64
+ <slot name="backgroundPicture"></slot>
65
+ ) : this.hasBackgroundImage ? (
66
+ <picture>
67
+ <img
68
+ loading={this.backgroundImageLoadingStrategy}
69
+ src={this.backgroundImage}
70
+ part="background-image"
71
+ className={`${rootClass}__background-image`}
72
+ alt={this.backgroundImageLabel}
73
+ />
74
+ </picture>
75
+ ) : null}
76
+ <div className={`${rootClass}__content-container`}>
77
+ <slot
78
+ id={`${rootClass}__content`}
79
+ name="content"
80
+ part="content">
81
+ </slot>
82
+ {this.hasAdditionalContent && (
83
+ <slot
84
+ id={`${rootClass}__additionalContent`}
85
+ name="additionalContent"
86
+ part="additionalContent">
87
+ </slot>
88
+ )}
89
+ </div>
90
+ </div>
91
+ )}
92
+ {this.hasMediaContent && (
93
+ <slot
94
+ id={`${rootClass}__mediaContent`}
95
+ name="mediaContent"
96
+ part="mediaContent">
97
+ </slot>
98
+ )}
99
+ </div>
100
+ );
101
+ }
package/src/InputGroup.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
2
3
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
5
  import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
6
  import Icon from "@ui5/webcomponents/dist/Icon.js";
7
7
  import type UDExCheckbox from "./Checkbox.js";
8
8
  import type UDExRadioButton from "./RadioButton.js";
9
9
  import UDExStatusMessage from "./StatusMessage.js";
10
- import InputGroupTemplate from "./generated/templates/InputGroupTemplate.lit.js";
10
+ import InputGroupTemplate from "./InputGroupTemplate.js";
11
11
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
12
12
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
13
13
  import {
@@ -49,7 +49,7 @@ export enum UDExOrientation {
49
49
 
50
50
  @customElement({
51
51
  tag: "udex-input-group",
52
- renderer: litRender,
52
+ renderer: jsxRenderer,
53
53
  styles: InputGroupCss,
54
54
  template: InputGroupTemplate,
55
55
  dependencies: [Icon, UDExStatusMessage],
@@ -119,10 +119,6 @@ class UDExInputGroup extends UI5Element {
119
119
  };
120
120
  }
121
121
 
122
- get hasValueState(): boolean {
123
- return this.valueState !== "Standard";
124
- }
125
-
126
122
  get valueStateText(): string | undefined {
127
123
  return this.supportingText || this.valueStateTypeMappings[this.valueState];
128
124
  }
@@ -0,0 +1,31 @@
1
+ import type UDExInputGroup from "./InputGroup.js";
2
+ import UDExStatusMessage from "./StatusMessage.js";
3
+
4
+ export default function InputGroupTemplate(this: UDExInputGroup) {
5
+ const rootClass = "udex-input-group";
6
+
7
+ return (
8
+ <>
9
+ <div id={`${this._id}-input-group`}
10
+ class={`${rootClass}__container`}
11
+ role="group"
12
+ aria-describedby={`${this._id}-valueStateDesc`}>
13
+ <div class={`${rootClass}__content`}>
14
+ {this._items.map((itemInfo, index) => (
15
+ <div key={index} class={`${rootClass}__item`}>
16
+ <slot name={`${itemInfo.item._individualSlot}`}></slot>
17
+ </div>
18
+ ))}
19
+ </div>
20
+ {this.valueStateText && (
21
+ <>
22
+ <UDExStatusMessage supporting-text={this.valueStateText} value-state={this.valueState}></UDExStatusMessage>
23
+ <span id={`${this._id}-valueStateDesc`} class="hidden-text">
24
+ {this.valueStateText}
25
+ </span>
26
+ </>
27
+ )}
28
+ </div>
29
+ </>
30
+ );
31
+ }
@@ -532,7 +532,7 @@ class UDExMastheadMobileMenu extends UI5Element {
532
532
  }
533
533
  }
534
534
 
535
- if (isExploreMode) {
535
+ if (isExploreMode && this.hasExploreBtnSlot) {
536
536
  analyticsPath.unshift(this.exploreItem.label);
537
537
  }
538
538
 
package/src/RatingBar.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
4
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
5
5
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
6
6
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
7
7
  import Icon from "@ui5/webcomponents/dist/Icon.js";
8
8
  import { STARS } from "./generated/i18n/i18n-defaults.js";
9
9
  import "@ui5/webcomponents-icons/dist/favorite.js";
10
- import RatingBarTemplate from "./generated/templates/RatingBarTemplate.lit.js";
10
+ import RatingBarTemplate from "./RatingBarTemplate.js";
11
11
 
12
12
  // Styles
13
13
  import RatingBarCss from "./generated/themes/RatingBar.css.js";
@@ -31,7 +31,7 @@ import RatingBarCss from "./generated/themes/RatingBar.css.js";
31
31
  */
32
32
  @customElement({
33
33
  tag: "udex-rating-bar",
34
- renderer: litRender,
34
+ renderer: jsxRenderer,
35
35
  styles: RatingBarCss,
36
36
  template: RatingBarTemplate,
37
37
  dependencies: [Icon],
@@ -0,0 +1,38 @@
1
+ import type RatingBar from "./RatingBar.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+ import favorite from "@ui5/webcomponents-icons/dist/favorite.js";
4
+
5
+ export default function RatingBarTemplate(this: RatingBar) {
6
+ const rootClass = "udex-rating-bar";
7
+
8
+ return (
9
+ <div className={`${rootClass}__container`}>
10
+ <div
11
+ aria-hidden="true"
12
+ className={`${rootClass}__rating`}>
13
+ {this.validatedRating}
14
+ </div>
15
+ <UI5Icon
16
+ aria-labelledby="ratingDescription"
17
+ name={favorite}
18
+ class={`${rootClass}__icon`}>
19
+ </UI5Icon>
20
+ <div className={`${rootClass}__track`}>
21
+ <div className={`${rootClass}__progress`}></div>
22
+ </div>
23
+ {this.showPercentage && (
24
+ <div
25
+ role="note"
26
+ className={`${rootClass}__percentage`}
27
+ aria-label={this.validatedPercentage}>
28
+ {this.validatedPercentage}
29
+ </div>
30
+ )}
31
+ <span
32
+ id="ratingDescription"
33
+ className="hidden-text">
34
+ {this._ratingDescription}
35
+ </span>
36
+ </div>
37
+ );
38
+ }