@sapudex/web-components 2.15.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 (150) hide show
  1. package/cypress/specs/HeroBanner.cy.tsx +6 -6
  2. package/cypress/specs/RatingBar.cy.tsx +41 -0
  3. package/cypress/specs/Tooltip.cy.tsx +6 -11
  4. package/dist/Accordion.js +44 -30
  5. package/dist/Accordion.js.map +1 -1
  6. package/dist/Footer.d.ts +17 -21
  7. package/dist/Footer.js +5 -11
  8. package/dist/Footer.js.map +1 -1
  9. package/dist/FooterTemplate.d.ts +2 -0
  10. package/dist/FooterTemplate.js +27 -0
  11. package/dist/FooterTemplate.js.map +1 -0
  12. package/dist/HeroBanner.js +4 -4
  13. package/dist/HeroBanner.js.map +1 -1
  14. package/dist/HeroBannerTemplate.d.ts +2 -0
  15. package/dist/HeroBannerTemplate.js +10 -0
  16. package/dist/HeroBannerTemplate.js.map +1 -0
  17. package/dist/RatingBar.js +3 -3
  18. package/dist/RatingBar.js.map +1 -1
  19. package/dist/RatingBarTemplate.d.ts +2 -0
  20. package/dist/RatingBarTemplate.js +8 -0
  21. package/dist/RatingBarTemplate.js.map +1 -0
  22. package/dist/StatusBadge.js +3 -3
  23. package/dist/StatusBadge.js.map +1 -1
  24. package/dist/StatusBadgeTemplate.d.ts +2 -0
  25. package/dist/StatusBadgeTemplate.js +7 -0
  26. package/dist/StatusBadgeTemplate.js.map +1 -0
  27. package/dist/StatusMessage.js +3 -3
  28. package/dist/StatusMessage.js.map +1 -1
  29. package/dist/StatusMessageTemplate.d.ts +2 -0
  30. package/dist/StatusMessageTemplate.js +8 -0
  31. package/dist/StatusMessageTemplate.js.map +1 -0
  32. package/dist/Switch.d.ts +1 -4
  33. package/dist/Switch.js +4 -8
  34. package/dist/Switch.js.map +1 -1
  35. package/dist/SwitchTemplate.d.ts +2 -0
  36. package/dist/SwitchTemplate.js +12 -0
  37. package/dist/SwitchTemplate.js.map +1 -0
  38. package/dist/TagGroup.d.ts +2 -0
  39. package/dist/TagGroup.js +10 -3
  40. package/dist/TagGroup.js.map +1 -1
  41. package/dist/assets/{InputSuggestions-D5z6eIC2.js → InputSuggestions-lpqKgn1j.js} +1 -1
  42. package/dist/assets/{ListItemStandardExpandableTextTemplate-BKeYxhnX.js → ListItemStandardExpandableTextTemplate-BPs3CyVq.js} +1 -1
  43. package/dist/assets/{bundle.esm-DXwtYGLH.js → bundle.esm-C3RAGF4b.js} +208 -208
  44. package/dist/css/themes/AccordionItem.css +1 -1
  45. package/dist/css/themes/CountrySelector.css +1 -1
  46. package/dist/css/themes/Link.css +1 -1
  47. package/dist/css/themes/PhoneNumberField.css +1 -1
  48. package/dist/css/themes/RatingBar.css +1 -1
  49. package/dist/css/themes/RatingIndicator.css +1 -1
  50. package/dist/css/themes/Search.css +1 -1
  51. package/dist/css/themes/SelectBox.css +1 -1
  52. package/dist/css/themes/Slider.css +1 -1
  53. package/dist/css/themes/TextArea.css +1 -1
  54. package/dist/css/themes/TextField.css +1 -1
  55. package/dist/custom-elements-internal.json +141 -141
  56. package/dist/custom-elements.json +126 -126
  57. package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
  58. package/dist/generated/themes/AccordionItem.css.js +1 -1
  59. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  60. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  61. package/dist/generated/themes/CountrySelector.css.js +1 -1
  62. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  63. package/dist/generated/themes/Link.css.d.ts +1 -1
  64. package/dist/generated/themes/Link.css.js +1 -1
  65. package/dist/generated/themes/Link.css.js.map +1 -1
  66. package/dist/generated/themes/PhoneNumberField.css.d.ts +1 -1
  67. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  68. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  69. package/dist/generated/themes/RatingBar.css.d.ts +1 -1
  70. package/dist/generated/themes/RatingBar.css.js +1 -1
  71. package/dist/generated/themes/RatingBar.css.js.map +1 -1
  72. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  73. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  74. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  75. package/dist/generated/themes/Search.css.d.ts +1 -1
  76. package/dist/generated/themes/Search.css.js +1 -1
  77. package/dist/generated/themes/Search.css.js.map +1 -1
  78. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  79. package/dist/generated/themes/SelectBox.css.js +1 -1
  80. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  81. package/dist/generated/themes/Slider.css.d.ts +1 -1
  82. package/dist/generated/themes/Slider.css.js +1 -1
  83. package/dist/generated/themes/Slider.css.js.map +1 -1
  84. package/dist/generated/themes/TextArea.css.d.ts +1 -1
  85. package/dist/generated/themes/TextArea.css.js +1 -1
  86. package/dist/generated/themes/TextArea.css.js.map +1 -1
  87. package/dist/generated/themes/TextField.css.d.ts +1 -1
  88. package/dist/generated/themes/TextField.css.js +1 -1
  89. package/dist/generated/themes/TextField.css.js.map +1 -1
  90. package/dist/web-types.json +1 -1
  91. package/package.json +1 -1
  92. package/src/Accordion.ts +56 -26
  93. package/src/Footer.ts +28 -35
  94. package/src/FooterTemplate.tsx +410 -0
  95. package/src/HeroBanner.ts +4 -4
  96. package/src/HeroBannerTemplate.tsx +101 -0
  97. package/src/RatingBar.ts +3 -3
  98. package/src/RatingBarTemplate.tsx +38 -0
  99. package/src/StatusBadge.ts +5 -4
  100. package/src/StatusBadgeTemplate.tsx +18 -0
  101. package/src/StatusMessage.ts +3 -3
  102. package/src/StatusMessageTemplate.tsx +20 -0
  103. package/src/Switch.ts +5 -11
  104. package/src/SwitchTemplate.tsx +50 -0
  105. package/src/TagGroup.ts +13 -3
  106. package/src/generated/themes/AccordionItem.css.ts +1 -1
  107. package/src/generated/themes/CountrySelector.css.ts +1 -1
  108. package/src/generated/themes/Link.css.ts +1 -1
  109. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  110. package/src/generated/themes/RatingBar.css.ts +1 -1
  111. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  112. package/src/generated/themes/Search.css.ts +1 -1
  113. package/src/generated/themes/SelectBox.css.ts +1 -1
  114. package/src/generated/themes/Slider.css.ts +1 -1
  115. package/src/generated/themes/TextArea.css.ts +1 -1
  116. package/src/generated/themes/TextField.css.ts +1 -1
  117. package/src/themes/AccordionItem.css +0 -1
  118. package/src/themes/CountrySelector.css +1 -7
  119. package/src/themes/Link.css +11 -4
  120. package/src/themes/PhoneNumberField.css +25 -7
  121. package/src/themes/RatingBar.css +2 -2
  122. package/src/themes/Search.css +7 -3
  123. package/src/themes/SelectBox.css +4 -0
  124. package/src/themes/TextArea.css +31 -7
  125. package/src/themes/TextField.css +15 -5
  126. package/dist/generated/templates/FooterTemplate.lit.d.ts +0 -3
  127. package/dist/generated/templates/FooterTemplate.lit.js +0 -39
  128. package/dist/generated/templates/FooterTemplate.lit.js.map +0 -1
  129. package/dist/generated/templates/RatingBarTemplate.lit.d.ts +0 -3
  130. package/dist/generated/templates/RatingBarTemplate.lit.js +0 -8
  131. package/dist/generated/templates/RatingBarTemplate.lit.js.map +0 -1
  132. package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +0 -3
  133. package/dist/generated/templates/StatusBadgeTemplate.lit.js +0 -7
  134. package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +0 -1
  135. package/dist/generated/templates/StatusMessageTemplate.lit.d.ts +0 -3
  136. package/dist/generated/templates/StatusMessageTemplate.lit.js +0 -8
  137. package/dist/generated/templates/StatusMessageTemplate.lit.js.map +0 -1
  138. package/dist/generated/templates/SwitchTemplate.lit.d.ts +0 -3
  139. package/dist/generated/templates/SwitchTemplate.lit.js +0 -14
  140. package/dist/generated/templates/SwitchTemplate.lit.js.map +0 -1
  141. package/src/Footer.hbs +0 -296
  142. package/src/RatingBar.hbs +0 -11
  143. package/src/StatusBadge.hbs +0 -9
  144. package/src/StatusMessage.hbs +0 -6
  145. package/src/Switch.hbs +0 -35
  146. package/src/generated/templates/FooterTemplate.lit.ts +0 -43
  147. package/src/generated/templates/RatingBarTemplate.lit.ts +0 -12
  148. package/src/generated/templates/StatusBadgeTemplate.lit.ts +0 -11
  149. package/src/generated/templates/StatusMessageTemplate.lit.ts +0 -12
  150. package/src/generated/templates/SwitchTemplate.lit.ts +0 -18
@@ -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/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
+ }
@@ -1,7 +1,7 @@
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 Icon from "@ui5/webcomponents/dist/Icon.js";
6
6
  import "@ui5/webcomponents-icons/dist/error.js";
7
7
  import "@ui5/webcomponents-icons/dist/alert.js";
@@ -20,7 +20,7 @@ import {
20
20
  STATUS_BADGE_WARNING_TITLE,
21
21
  } from "./generated/i18n/i18n-defaults.js";
22
22
 
23
- import StatusBadgeTemplate from "./generated/templates/StatusBadgeTemplate.lit.js";
23
+ import StatusBadgeTemplate from "./StatusBadgeTemplate.js";
24
24
 
25
25
  // Styles
26
26
  import StatusBadgeCss from "./generated/themes/StatusBadge.css.js";
@@ -60,11 +60,12 @@ export enum BadgeSize {
60
60
  */
61
61
  @customElement({
62
62
  tag: "udex-status-badge",
63
- renderer: litRender,
63
+ renderer: jsxRenderer,
64
64
  styles: StatusBadgeCss,
65
65
  template: StatusBadgeTemplate,
66
66
  dependencies: [Icon],
67
67
  })
68
+
68
69
  class UDExStatusBadge extends UI5Element {
69
70
  /**
70
71
  * Defines the value state of the component.
@@ -107,7 +108,7 @@ class UDExStatusBadge extends UI5Element {
107
108
  return `${this.accessibleName ? this.accessibleName : UDExStatusBadge.i18nBundle.getText(STATUS_BADGE_TEXT)}`;
108
109
  }
109
110
 
110
- get ariaTitle() {
111
+ get ariaTitle(): string {
111
112
  switch (IconMapping[this.valueState]) {
112
113
  case IconMapping.Edit:
113
114
  return UDExStatusBadge.i18nBundle.getText(STATUS_BADGE_EDIT_TITLE);
@@ -0,0 +1,18 @@
1
+ import type StatusBadge from "./StatusBadge.js";
2
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
3
+
4
+ export default function StatusBadgeTemplate(this: StatusBadge) {
5
+ const rootClass = "udex-status-badge";
6
+
7
+ return (
8
+ <div
9
+ className={rootClass}
10
+ title={this.ariaTitle}>
11
+ <UI5Icon
12
+ class={`${rootClass}__icon`}
13
+ name={this.iconFieldName}
14
+ accessibleName={this.badgeAccessibleName}>
15
+ </UI5Icon>
16
+ </div>
17
+ );
18
+ }