@sapudex/web-components 2.53.0 → 2.55.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 (339) hide show
  1. package/cypress/specs/Breadcrumbs.cy.tsx +3 -1
  2. package/cypress/specs/FilterMenu.cy.tsx +68 -2
  3. package/cypress/specs/Footer.cy.tsx +59 -0
  4. package/cypress/specs/MediaPlayer.cy.tsx +58 -0
  5. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +2 -2
  6. package/cypress/specs/SelectBox.cy.tsx +117 -0
  7. package/dist/Accordion.js +1 -1
  8. package/dist/Accordion.js.map +1 -1
  9. package/dist/AccordionItem.js +1 -1
  10. package/dist/AccordionItem.js.map +1 -1
  11. package/dist/Avatar.d.ts +2 -2
  12. package/dist/Avatar.js +1 -1
  13. package/dist/Avatar.js.map +1 -1
  14. package/dist/Badge.js +1 -1
  15. package/dist/Badge.js.map +1 -1
  16. package/dist/Breadcrumbs.js +1 -1
  17. package/dist/Breadcrumbs.js.map +1 -1
  18. package/dist/BreadcrumbsTemplate.js +1 -1
  19. package/dist/BreadcrumbsTemplate.js.map +1 -1
  20. package/dist/Carousel.js +1 -1
  21. package/dist/Carousel.js.map +1 -1
  22. package/dist/Contact.js +1 -1
  23. package/dist/Contact.js.map +1 -1
  24. package/dist/ContactItem.js +1 -1
  25. package/dist/ContactItem.js.map +1 -1
  26. package/dist/Feed.d.ts +2 -1
  27. package/dist/Feed.js +1 -1
  28. package/dist/Feed.js.map +1 -1
  29. package/dist/FeedItem.d.ts +2 -1
  30. package/dist/FeedItem.js +1 -1
  31. package/dist/FeedItem.js.map +1 -1
  32. package/dist/FilterMenu.d.ts +1 -1
  33. package/dist/FilterMenu.js +6 -6
  34. package/dist/FilterMenu.js.map +1 -1
  35. package/dist/FilterMenuGroupHeader.js +1 -1
  36. package/dist/FilterMenuGroupHeader.js.map +1 -1
  37. package/dist/Footer.d.ts +22 -2
  38. package/dist/Footer.js +41 -4
  39. package/dist/Footer.js.map +1 -1
  40. package/dist/FooterTemplate.js +7 -2
  41. package/dist/FooterTemplate.js.map +1 -1
  42. package/dist/ImageGridCloud.js +1 -1
  43. package/dist/ImageGridCloud.js.map +1 -1
  44. package/dist/ImageGridTable.js +1 -1
  45. package/dist/ImageGridTable.js.map +1 -1
  46. package/dist/ImageGridTableItem.js +1 -1
  47. package/dist/ImageGridTableItem.js.map +1 -1
  48. package/dist/ImageGridTicker.js +1 -1
  49. package/dist/ImageGridTicker.js.map +1 -1
  50. package/dist/InputGroup.js +1 -1
  51. package/dist/InputGroup.js.map +1 -1
  52. package/dist/LinkList.js +1 -1
  53. package/dist/LinkList.js.map +1 -1
  54. package/dist/List.js +7 -7
  55. package/dist/List.js.map +1 -1
  56. package/dist/ListGroupHeader.js +12 -5
  57. package/dist/ListGroupHeader.js.map +1 -1
  58. package/dist/ListGroupHeaderBase.d.ts +1 -1
  59. package/dist/ListGroupHeaderBase.js +3 -3
  60. package/dist/ListGroupHeaderBase.js.map +1 -1
  61. package/dist/ListGroupHeaderTemplate.d.ts +2 -0
  62. package/dist/ListGroupHeaderTemplate.js +33 -0
  63. package/dist/ListGroupHeaderTemplate.js.map +1 -0
  64. package/dist/ListItem.d.ts +3 -3
  65. package/dist/ListItem.js +5 -4
  66. package/dist/ListItem.js.map +1 -1
  67. package/dist/ListItemBase.d.ts +1 -0
  68. package/dist/ListItemBase.js +8 -4
  69. package/dist/ListItemBase.js.map +1 -1
  70. package/dist/ListItemTemplate.d.ts +2 -0
  71. package/dist/ListItemTemplate.js +18 -0
  72. package/dist/ListItemTemplate.js.map +1 -0
  73. package/dist/ListSelectAll.js +4 -5
  74. package/dist/ListSelectAll.js.map +1 -1
  75. package/dist/ListSelectAllTemplate.d.ts +2 -0
  76. package/dist/ListSelectAllTemplate.js +6 -0
  77. package/dist/ListSelectAllTemplate.js.map +1 -0
  78. package/dist/ListTemplate.d.ts +2 -0
  79. package/dist/ListTemplate.js +11 -0
  80. package/dist/ListTemplate.js.map +1 -0
  81. package/dist/MastheadItem.d.ts +3 -3
  82. package/dist/MastheadItem.js +1 -1
  83. package/dist/MastheadItem.js.map +1 -1
  84. package/dist/MastheadMobileMenu.d.ts +3 -3
  85. package/dist/MastheadMobileMenu.js +1 -1
  86. package/dist/MastheadMobileMenu.js.map +1 -1
  87. package/dist/MastheadProfileMenu.d.ts +3 -2
  88. package/dist/MastheadProfileMenu.js +1 -1
  89. package/dist/MastheadProfileMenu.js.map +1 -1
  90. package/dist/MastheadShell.d.ts +9 -9
  91. package/dist/MastheadShell.js +1 -1
  92. package/dist/MastheadShell.js.map +1 -1
  93. package/dist/MediaPlayer.d.ts +1 -1
  94. package/dist/MediaPlayer.js +11 -3
  95. package/dist/MediaPlayer.js.map +1 -1
  96. package/dist/MediaPlayerVimeo.d.ts +6 -0
  97. package/dist/MediaPlayerVimeo.js +27 -6
  98. package/dist/MediaPlayerVimeo.js.map +1 -1
  99. package/dist/MediaPlayerYoutube.d.ts +3 -0
  100. package/dist/MediaPlayerYoutube.js +24 -5
  101. package/dist/MediaPlayerYoutube.js.map +1 -1
  102. package/dist/MessageStrip.d.ts +2 -1
  103. package/dist/MessageStrip.js +1 -1
  104. package/dist/MessageStrip.js.map +1 -1
  105. package/dist/Modal.d.ts +2 -0
  106. package/dist/Modal.js +10 -3
  107. package/dist/Modal.js.map +1 -1
  108. package/dist/PromoTile.d.ts +2 -2
  109. package/dist/PromoTile.js +1 -1
  110. package/dist/PromoTile.js.map +1 -1
  111. package/dist/Quote.d.ts +4 -4
  112. package/dist/Quote.js +1 -1
  113. package/dist/Quote.js.map +1 -1
  114. package/dist/Review.d.ts +3 -3
  115. package/dist/Review.js +1 -1
  116. package/dist/Review.js.map +1 -1
  117. package/dist/ReviewItem.d.ts +4 -3
  118. package/dist/ReviewItem.js +1 -1
  119. package/dist/ReviewItem.js.map +1 -1
  120. package/dist/Search.js +1 -1
  121. package/dist/Search.js.map +1 -1
  122. package/dist/SearchableListBase.js +5 -1
  123. package/dist/SearchableListBase.js.map +1 -1
  124. package/dist/SecondaryNavigation.d.ts +3 -3
  125. package/dist/SecondaryNavigation.js +1 -1
  126. package/dist/SecondaryNavigation.js.map +1 -1
  127. package/dist/SecondaryNavigationItem.d.ts +2 -1
  128. package/dist/SecondaryNavigationItem.js +1 -1
  129. package/dist/SecondaryNavigationItem.js.map +1 -1
  130. package/dist/SelectBase.js +1 -1
  131. package/dist/SelectBase.js.map +1 -1
  132. package/dist/SelectBox.js +31 -0
  133. package/dist/SelectBox.js.map +1 -1
  134. package/dist/SelectBoxGroupHeader.js +1 -1
  135. package/dist/SelectBoxGroupHeader.js.map +1 -1
  136. package/dist/SelectBoxItem.d.ts +3 -3
  137. package/dist/SelectBoxItem.js +1 -1
  138. package/dist/SelectBoxItem.js.map +1 -1
  139. package/dist/SelectBoxTemplate.js +2 -1
  140. package/dist/SelectBoxTemplate.js.map +1 -1
  141. package/dist/SideNavigationMobile.d.ts +2 -2
  142. package/dist/SideNavigationMobile.js +1 -1
  143. package/dist/SideNavigationMobile.js.map +1 -1
  144. package/dist/SocialMediaButton.js +1 -1
  145. package/dist/SocialMediaButton.js.map +1 -1
  146. package/dist/Tab.d.ts +2 -2
  147. package/dist/Tab.js +1 -1
  148. package/dist/Tab.js.map +1 -1
  149. package/dist/TabNavigation.d.ts +2 -2
  150. package/dist/TabNavigation.js +1 -1
  151. package/dist/TabNavigation.js.map +1 -1
  152. package/dist/Table.d.ts +5 -5
  153. package/dist/Table.js +1 -1
  154. package/dist/Table.js.map +1 -1
  155. package/dist/TableCellBase.js +1 -1
  156. package/dist/TableCellBase.js.map +1 -1
  157. package/dist/TableGroupRow.js +1 -1
  158. package/dist/TableGroupRow.js.map +1 -1
  159. package/dist/TableRowBase.js +1 -1
  160. package/dist/TableRowBase.js.map +1 -1
  161. package/dist/TagGroup.js +1 -1
  162. package/dist/TagGroup.js.map +1 -1
  163. package/dist/Tile.d.ts +2 -1
  164. package/dist/Tile.js +1 -1
  165. package/dist/Tile.js.map +1 -1
  166. package/dist/Tooltip.d.ts +2 -1
  167. package/dist/Tooltip.js +1 -1
  168. package/dist/Tooltip.js.map +1 -1
  169. package/dist/Wizard.js +1 -1
  170. package/dist/Wizard.js.map +1 -1
  171. package/dist/assets/{InputSuggestions-0yCPXAmq.js → InputSuggestions-DPiJnNLn.js} +1 -1
  172. package/dist/assets/{ListItemStandardExpandableTextTemplate-DjZEnCXN.js → ListItemStandardExpandableTextTemplate-B-v72jL6.js} +1 -1
  173. package/dist/assets/{bundle.esm-DJuMR5ko.js → bundle.esm-DPppjwN7.js} +260 -260
  174. package/dist/assets/messagebundle_en-B0P3kkb6.js +1 -0
  175. package/dist/assets/messagebundle_it-BML2SC0W.js +1 -0
  176. package/dist/assets/messagebundle_ja-zyFfZHcj.js +1 -0
  177. package/dist/assets/messagebundle_ko-BCPaSqNp.js +1 -0
  178. package/dist/assets/messagebundle_lt-DB4b6FVx.js +1 -0
  179. package/dist/assets/messagebundle_lv-tAOia5tU.js +1 -0
  180. package/dist/css/themes/AccordionItem.css +1 -1
  181. package/dist/css/themes/Breadcrumbs.css +1 -1
  182. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  183. package/dist/css/themes/Footer.css +1 -1
  184. package/dist/css/themes/Link.css +1 -1
  185. package/dist/css/themes/ListGroupHeader.css +1 -1
  186. package/dist/custom-elements-internal.json +267 -157
  187. package/dist/custom-elements.json +221 -133
  188. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  189. package/dist/generated/assets/i18n/messagebundle_it.json +1 -1
  190. package/dist/generated/assets/i18n/messagebundle_ja.json +1 -1
  191. package/dist/generated/assets/i18n/messagebundle_ko.json +1 -1
  192. package/dist/generated/assets/i18n/messagebundle_lt.json +1 -1
  193. package/dist/generated/assets/i18n/messagebundle_lv.json +1 -1
  194. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  195. package/dist/generated/i18n/i18n-defaults.js +2 -1
  196. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  197. package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
  198. package/dist/generated/themes/AccordionItem.css.js +1 -1
  199. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  200. package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
  201. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  202. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  203. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  204. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  205. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  206. package/dist/generated/themes/Footer.css.d.ts +1 -1
  207. package/dist/generated/themes/Footer.css.js +1 -1
  208. package/dist/generated/themes/Footer.css.js.map +1 -1
  209. package/dist/generated/themes/Link.css.d.ts +1 -1
  210. package/dist/generated/themes/Link.css.js +1 -1
  211. package/dist/generated/themes/Link.css.js.map +1 -1
  212. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  213. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  214. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  215. package/dist/messagebundle.properties +1 -0
  216. package/dist/messagebundle_en.properties +1 -0
  217. package/dist/messagebundle_it.properties +123 -0
  218. package/dist/messagebundle_ja.properties +127 -1
  219. package/dist/messagebundle_ko.properties +126 -0
  220. package/dist/messagebundle_lt.properties +126 -0
  221. package/dist/messagebundle_lv.properties +9 -0
  222. package/dist/types/FooterAskJoulePosition.d.ts +5 -0
  223. package/dist/types/FooterAskJoulePosition.js +7 -0
  224. package/dist/types/FooterAskJoulePosition.js.map +1 -0
  225. package/dist/vscode.html-custom-data.json +13 -3
  226. package/dist/web-types.json +56 -9
  227. package/package.json +1 -1
  228. package/src/Accordion.ts +1 -1
  229. package/src/AccordionItem.ts +1 -1
  230. package/src/Avatar.ts +3 -3
  231. package/src/Badge.ts +1 -1
  232. package/src/Breadcrumbs.ts +1 -1
  233. package/src/BreadcrumbsTemplate.tsx +12 -10
  234. package/src/Carousel.ts +1 -1
  235. package/src/Contact.ts +1 -1
  236. package/src/ContactItem.ts +1 -1
  237. package/src/Feed.ts +3 -2
  238. package/src/FeedItem.ts +3 -2
  239. package/src/FilterMenu.ts +6 -6
  240. package/src/FilterMenuGroupHeader.ts +1 -1
  241. package/src/Footer.ts +44 -5
  242. package/src/FooterTemplate.tsx +28 -4
  243. package/src/ImageGridCloud.ts +1 -1
  244. package/src/ImageGridTable.ts +1 -1
  245. package/src/ImageGridTableItem.ts +1 -1
  246. package/src/ImageGridTicker.ts +1 -1
  247. package/src/InputGroup.ts +1 -1
  248. package/src/LinkList.ts +1 -1
  249. package/src/List.ts +9 -9
  250. package/src/ListGroupHeader.ts +12 -5
  251. package/src/ListGroupHeaderBase.ts +4 -4
  252. package/src/ListGroupHeaderTemplate.tsx +228 -0
  253. package/src/ListItem.ts +8 -7
  254. package/src/ListItemBase.ts +9 -4
  255. package/src/ListItemTemplate.tsx +193 -0
  256. package/src/ListSelectAll.ts +4 -5
  257. package/src/ListSelectAllTemplate.tsx +38 -0
  258. package/src/ListTemplate.tsx +60 -0
  259. package/src/MastheadItem.ts +4 -4
  260. package/src/MastheadMobileMenu.ts +4 -4
  261. package/src/MastheadProfileMenu.ts +4 -3
  262. package/src/MastheadShell.ts +10 -10
  263. package/src/MediaPlayer.ts +11 -4
  264. package/src/MediaPlayerVimeo.ts +31 -6
  265. package/src/MediaPlayerYoutube.ts +24 -5
  266. package/src/MessageStrip.ts +3 -2
  267. package/src/Modal.ts +18 -3
  268. package/src/PromoTile.ts +3 -3
  269. package/src/Quote.ts +5 -5
  270. package/src/Review.ts +4 -4
  271. package/src/ReviewItem.ts +5 -4
  272. package/src/Search.ts +1 -1
  273. package/src/SearchableListBase.ts +6 -1
  274. package/src/SecondaryNavigation.ts +4 -4
  275. package/src/SecondaryNavigationItem.ts +3 -2
  276. package/src/SelectBase.ts +1 -1
  277. package/src/SelectBox.ts +34 -0
  278. package/src/SelectBoxGroupHeader.ts +1 -1
  279. package/src/SelectBoxItem.ts +4 -4
  280. package/src/SelectBoxTemplate.tsx +2 -0
  281. package/src/SideNavigationMobile.ts +3 -3
  282. package/src/SocialMediaButton.ts +1 -1
  283. package/src/Tab.ts +3 -3
  284. package/src/TabNavigation.ts +3 -3
  285. package/src/Table.ts +6 -6
  286. package/src/TableCellBase.ts +1 -1
  287. package/src/TableGroupRow.ts +1 -1
  288. package/src/TableRowBase.ts +1 -1
  289. package/src/TagGroup.ts +1 -1
  290. package/src/Tile.ts +3 -2
  291. package/src/Tooltip.ts +3 -2
  292. package/src/Wizard.ts +1 -1
  293. package/src/generated/i18n/i18n-defaults.ts +2 -2
  294. package/src/generated/themes/AccordionItem.css.ts +1 -1
  295. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  296. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  297. package/src/generated/themes/Footer.css.ts +1 -1
  298. package/src/generated/themes/Link.css.ts +1 -1
  299. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  300. package/src/i18n/messagebundle.properties +1 -0
  301. package/src/i18n/messagebundle_en.properties +1 -0
  302. package/src/i18n/messagebundle_it.properties +123 -0
  303. package/src/i18n/messagebundle_ja.properties +127 -1
  304. package/src/i18n/messagebundle_ko.properties +126 -0
  305. package/src/i18n/messagebundle_lt.properties +126 -0
  306. package/src/i18n/messagebundle_lv.properties +9 -0
  307. package/src/themes/AccordionItem.css +2 -2
  308. package/src/themes/Breadcrumbs.css +46 -5
  309. package/src/themes/BreadcrumbsPopover.css +65 -0
  310. package/src/themes/Footer.css +99 -2
  311. package/src/themes/Link.css +127 -8
  312. package/src/themes/ListGroupHeader.css +6 -3
  313. package/src/types/FooterAskJoulePosition.ts +6 -0
  314. package/dist/assets/messagebundle_en-DoNTK1BE.js +0 -1
  315. package/dist/assets/messagebundle_it-BhrBdOd4.js +0 -1
  316. package/dist/assets/messagebundle_ja-5P5L7sQ1.js +0 -1
  317. package/dist/assets/messagebundle_ko-B9H5YQlC.js +0 -1
  318. package/dist/assets/messagebundle_lt-BJ5gr_LF.js +0 -1
  319. package/dist/assets/messagebundle_lv-D06tlATH.js +0 -1
  320. package/dist/generated/templates/ListGroupHeaderTemplate.lit.d.ts +0 -3
  321. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +0 -30
  322. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +0 -1
  323. package/dist/generated/templates/ListItemTemplate.lit.d.ts +0 -3
  324. package/dist/generated/templates/ListItemTemplate.lit.js +0 -49
  325. package/dist/generated/templates/ListItemTemplate.lit.js.map +0 -1
  326. package/dist/generated/templates/ListSelectAllTemplate.lit.d.ts +0 -3
  327. package/dist/generated/templates/ListSelectAllTemplate.lit.js +0 -7
  328. package/dist/generated/templates/ListSelectAllTemplate.lit.js.map +0 -1
  329. package/dist/generated/templates/ListTemplate.lit.d.ts +0 -3
  330. package/dist/generated/templates/ListTemplate.lit.js +0 -11
  331. package/dist/generated/templates/ListTemplate.lit.js.map +0 -1
  332. package/src/List.hbs +0 -38
  333. package/src/ListGroupHeader.hbs +0 -188
  334. package/src/ListItem.hbs +0 -166
  335. package/src/ListSelectAll.hbs +0 -31
  336. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +0 -34
  337. package/src/generated/templates/ListItemTemplate.lit.ts +0 -53
  338. package/src/generated/templates/ListSelectAllTemplate.lit.ts +0 -11
  339. package/src/generated/templates/ListTemplate.lit.ts +0 -15
@@ -0,0 +1,193 @@
1
+ import type { AriaRole } from "@ui5/webcomponents-base/dist/types.js";
2
+ import type UDExListItem from "./ListItem.js";
3
+ import UDExCheckbox from "./Checkbox.js";
4
+ import UDExRadioButton from "./RadioButton.js";
5
+ import Icon from "@ui5/webcomponents/dist/Icon.js";
6
+ import UDExAvatar from "./Avatar.js";
7
+ import UDExStatusBadge from "./StatusBadge.js";
8
+ import UDExRatingIndicator from "./RatingIndicator.js";
9
+ import UDExButton from "./Button.js";
10
+ import UDExButtonSize from "./types/ButtonSize.js";
11
+ import UDExButtonDesign from "./types/ButtonDesign.js";
12
+ import slimArrowRight from "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
13
+
14
+ function ContentList(this: UDExListItem) {
15
+ return (
16
+ <div
17
+ class="udex-list__content-wrap"
18
+ {...({ "_id": this._id } as object)}
19
+ aria-labelledby={`${this._id}-invisibleText`}
20
+ aria-label={this.accessibleListItemName}>
21
+ {this.flag && (
22
+ <div class="udex-list__flag-wrap">
23
+ <span class="udex-list__flag" style={{ backgroundPosition: this.flagPosition }}></span>
24
+ </div>
25
+ )}
26
+ {this.typeNumber && <span class="udex-list__number">{this.numberOfItem}.</span>}
27
+ {this.typeCircle && <span class="udex-list__circle">&#x2022;</span>}
28
+ {this.typeIcon && (
29
+ <Icon
30
+ name={this._icon}
31
+ class="udex-list__icon"
32
+ accessible-role="presentation"
33
+ aria-hidden="true"
34
+ part="icon"
35
+ />
36
+ )}
37
+ {this.image && (
38
+ <UDExAvatar
39
+ class="udex-list__avatar"
40
+ part="avatar"
41
+ shape={this.imageShape}
42
+ size={this.imageSize}>
43
+ {this.imageBadgeState && (
44
+ <UDExStatusBadge
45
+ slot="badge"
46
+ value-state={this.imageBadgeState}
47
+ size={this.imageSize}
48
+ />
49
+ )}
50
+ <img src={this.image} alt={this.imageAlt} />
51
+ </UDExAvatar>
52
+ )}
53
+ <div class="udex-list__content" part="content">
54
+ {this.label ? (
55
+ <>
56
+ <div class="udex-list__text-holder">
57
+ <span part="title" {...({ innerHTML: this.label } as object)}></span>
58
+ {this.supportingText && (
59
+ <span class="udex-list__supporting-text" part="supporting">{this.supportingText}</span>
60
+ )}
61
+ <slot part="content"></slot>
62
+ {this.hasRating && (
63
+ <UDExRatingIndicator
64
+ aria-label={this.ratingAriaLabel}
65
+ value={this.rating !== undefined ? Number(this.rating) : undefined}
66
+ rating-count={this.ratingCount}
67
+ total-count={this.totalCount}
68
+ max={this.ratingMax}
69
+ display={this._displayRating}
70
+ disabled
71
+ readonly
72
+ />
73
+ )}
74
+ </div>
75
+ {this.additionalText && (
76
+ <div class="udex-list__add-text" part="additional-text">{this.additionalText}</div>
77
+ )}
78
+ <div class="udex-list__btn-wrap">
79
+ {this.hasFirstIcon && <slot name="firstIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
80
+ {this.hasSecondIcon && <slot name="secondIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
81
+ </div>
82
+ </>
83
+ ) : (
84
+ <>
85
+ <div class="udex-list__text-holder">
86
+ <slot part="content"></slot>
87
+ {this.supportingText && (
88
+ <span class="udex-list__supporting-text" part="supporting">{this.supportingText}</span>
89
+ )}
90
+ {this.hasRating && (
91
+ <UDExRatingIndicator
92
+ aria-label={this.ratingAriaLabel}
93
+ value={this.rating !== undefined ? Number(this.rating) : undefined}
94
+ rating-count={this.ratingCount}
95
+ total-count={this.totalCount}
96
+ max={this.ratingMax}
97
+ display={this._displayRating}
98
+ disabled
99
+ readonly
100
+ />
101
+ )}
102
+ </div>
103
+ {this.additionalText && (
104
+ <div class="udex-list__add-text" part="additional-text">{this.additionalText}</div>
105
+ )}
106
+ <div class="udex-list__btn-wrap">
107
+ {this.hasFirstIcon && <slot name="firstIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
108
+ {this.hasSecondIcon && <slot name="secondIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
109
+ </div>
110
+ </>
111
+ )}
112
+ {this.collapsible && (
113
+ <div class="udex-list__group-heading__icon-wrapper">
114
+ <UDExButton
115
+ class="udex-list__group-heading__icon"
116
+ size={UDExButtonSize.Small}
117
+ design={UDExButtonDesign.Tertiary}
118
+ onMouseDown={this.handleCollapseIconMouseDown}
119
+ onClick={this.handleCollapseIconClick as EventListener}
120
+ tabindex={-1}
121
+ accessible-name={this.expandButtonAccessibleName}
122
+ {...({ "mode": "Interactive" } as object)}
123
+ icon={slimArrowRight}
124
+ />
125
+ </div>
126
+ )}
127
+ </div>
128
+ <div class="hidden" id={`${this._id}-invisibleText`}>{this.accessibleListItemName}</div>
129
+ <div class="hidden" id={`${this._id}-invisibleText-describedby`}>{this.itemState}</div>
130
+ </div>
131
+ );
132
+ }
133
+
134
+ export default function ListItemTemplate(this: UDExListItem) {
135
+ return (
136
+ <>
137
+ {this.modeSelected && (
138
+ <div
139
+ part="item"
140
+ tabIndex={Number(this._effectiveTabIndex)}
141
+ aria-disabled={this._ariaDisabled}
142
+ class={this.className}
143
+ role={this.roleItem as AriaRole}
144
+ aria-checked={this.ariaCheckedValue}
145
+ aria-selected={this.ariaSelectedValue}
146
+ aria-expanded={this.ariaExpandedValue}
147
+ onFocusIn={this.handleFocusIn}
148
+ onFocusOut={this.handleFocusOut}
149
+ onClick={this.handleItemClick}
150
+ onMouseDown={this.handleMouseDown}
151
+ onMouseUp={this.handleMouseUp}
152
+ onKeyUp={this.handleKeyUp}
153
+ onKeyDown={this.handleKeyDown}
154
+ {...({ divider: this.divider, "_id": this._id } as object)}
155
+ data-selected={this.selected}
156
+ aria-describedby={this.itemDescribedBy}>
157
+ {this.modeMultiSelect && (
158
+ <UDExCheckbox
159
+ class="udex-list__checkbox"
160
+ part="checkbox"
161
+ tabindex={-1}
162
+ indeterminate={this.indeterminate}
163
+ accessible-name={`checkbox ${this.stateAccessibleName}`}
164
+ checked={this.selected}
165
+ disabled={this.disabled}
166
+ aria-hidden={this.checkboxAriaHidden ? "true" : undefined}
167
+ />
168
+ )}
169
+ {this.modeRadioGroup && (
170
+ <UDExRadioButton
171
+ class="udex-list__radio"
172
+ part="radio"
173
+ tabindex={-1}
174
+ accessible-name={`radio ${this.stateAccessibleName}`}
175
+ checked={this.selected}
176
+ disabled={this.disabled}
177
+ />
178
+ )}
179
+ {ContentList.call(this)}
180
+ </div>
181
+ )}
182
+ {this.modeSingleContent && (
183
+ <div
184
+ part="item"
185
+ role={this.roleItem as AriaRole}
186
+ aria-selected={this.selected}
187
+ class={this.className}>
188
+ {ContentList.call(this)}
189
+ </div>
190
+ )}
191
+ </>
192
+ );
193
+ }
@@ -1,14 +1,13 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
3
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
4
4
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
5
5
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
6
6
  import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
7
7
  import UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
8
8
  import { UDExListMode } from "./types/List.js";
9
9
  import { SELECT_ALL } from "./generated/i18n/i18n-defaults.js";
10
- import ListSelectAllTemplate from "./generated/templates/ListSelectAllTemplate.lit.js";
11
- import UDExListItem from "./ListItem.js";
10
+ import ListSelectAllTemplate from "./ListSelectAllTemplate.js";
12
11
  import type { UDExListItemBaseEvents } from "./ListItemBase.js";
13
12
  import translate from "./utils/translate.js";
14
13
 
@@ -41,10 +40,10 @@ type UDExListSelectAllSelectAllEventDetail = {
41
40
  */
42
41
  @customElement({
43
42
  tag: "udex-list-select-all",
44
- renderer: litRender,
43
+ renderer: jsxRenderer,
44
+ languageAware: true,
45
45
  styles: ListGroupHeaderCss,
46
46
  template: ListSelectAllTemplate,
47
- dependencies: [UDExListItem],
48
47
  })
49
48
  /**
50
49
  * Fired when the user clicks on the Select All header.
@@ -0,0 +1,38 @@
1
+ import type UDExListSelectAll from "./ListSelectAll.js";
2
+ import UDExListItem from "./ListItem.js";
3
+
4
+ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
5
+ return (
6
+ <div
7
+ part="item"
8
+ class="udex-list__group"
9
+ role="group"
10
+ aria-labelledby="group-select-all">
11
+ <div
12
+ role="listbox"
13
+ aria-label="select-all-group"
14
+ class={this.groupListClassName}
15
+ onui5-item-press={this.handleSelectAllGroupItemsPress}>
16
+ <UDExListItem
17
+ role="group"
18
+ part="group-item"
19
+ accessible-role="option"
20
+ mode={this.multiselectMode}
21
+ onClick={this.handleSelectAllPress}
22
+ class={this.className}
23
+ selected={this.selected}
24
+ aria-current={this.selected}
25
+ indeterminate={this.indeterminate}
26
+ controlled={this.controlled}
27
+ onKeyDown={this.handleKeyDownPress}
28
+ _tab-index={Number(this._effectiveTabIndex)}
29
+ _additional-class-name={this.additionalClassName}
30
+ supportingText={this.supportingText}
31
+ divider>
32
+ {this.selectAllLabel}
33
+ </UDExListItem>
34
+ <slot></slot>
35
+ </div>
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,60 @@
1
+ import type UDExList from "./List.js";
2
+ import type { AriaRole } from "@ui5/webcomponents-base/types.js";
3
+
4
+ export default function ListTemplate(this: UDExList) {
5
+ return (
6
+ <>
7
+ {this.modeSelected && (
8
+ <div
9
+ class="udex-list-root"
10
+ onKeyDown={this.handleKeyDown}
11
+ style={{ height: this.holderHeight }}
12
+ onui5-item-press={this.handleItemPress}
13
+ onui5-header-press={this.handleItemPress}>
14
+ <div class="udex-list__scroll-container">
15
+ {HeaderText.call(this)}
16
+ <span id={`${this._id}-mode-label`} class="udex-list__hidden-text">
17
+ {this.ariaLabelModeText}
18
+ </span>
19
+ <div
20
+ id="udex-list"
21
+ class="udex-list"
22
+ role={this.effectiveAccessibleRole as AriaRole}
23
+ aria-labelledby={this.ariaLabelledBy}
24
+ aria-multiselectable={this._listAriaMultiSelectable as "true" | undefined}
25
+ aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
26
+ <slot></slot>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ )}
31
+ {this.modeSingleContent && (
32
+ <>
33
+ {HeaderText.call(this)}
34
+ <div
35
+ id="udex-list"
36
+ class="udex-list"
37
+ role={this.accessibleRole as AriaRole}
38
+ aria-label={this.singleContentAriaLabel}
39
+ aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
40
+ <slot></slot>
41
+ </div>
42
+ </>
43
+ )}
44
+ </>
45
+ );
46
+ }
47
+
48
+ function HeaderText(this: UDExList) {
49
+ if (!this.headerText) {
50
+ return null;
51
+ }
52
+ return (
53
+ <header
54
+ id={`${this._id}-mode-label`}
55
+ class="udex-list__header-text"
56
+ part="header">
57
+ {this.headerText}
58
+ </header>
59
+ );
60
+ }
@@ -1,8 +1,8 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
- import type { DefaultSlot, ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import type { DefaultSlot, Slot, ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
3
3
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
- import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
6
6
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
7
7
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
@@ -299,7 +299,7 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
299
299
  * @public
300
300
  */
301
301
  @slot({ type: HTMLElement })
302
- dropdown?: Array<HTMLElement>;
302
+ dropdown!: Slot<HTMLElement>;
303
303
 
304
304
  /**
305
305
  * Slot for any content
@@ -308,7 +308,7 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
308
308
  * @public
309
309
  */
310
310
  @slot({ type: HTMLElement, "default": true })
311
- content?: DefaultSlot<HTMLElement>;
311
+ content!: DefaultSlot<HTMLElement>;
312
312
 
313
313
  /**
314
314
  * Defines the prevents the item from losing focus.
@@ -1,9 +1,9 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
- import type { DefaultSlot } from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import type { DefaultSlot, Slot } from "@ui5/webcomponents-base/dist/UI5Element.js";
3
3
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
5
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
- import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
6
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
7
7
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
8
8
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
9
9
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
@@ -106,7 +106,7 @@ class UDExMastheadMobileMenu extends UI5Element {
106
106
  * @public
107
107
  */
108
108
  @slot({ type: Node })
109
- search!: Array<Node>;
109
+ search!: Slot<Node>;
110
110
 
111
111
  /**
112
112
  * List of the menu items
@@ -124,7 +124,7 @@ class UDExMastheadMobileMenu extends UI5Element {
124
124
  * @public
125
125
  */
126
126
  @slot({ type: HTMLElement })
127
- exploreSapMobileButton?: UDExMastheadItem;
127
+ exploreSapMobileButton!: Slot<UDExMastheadItem>;
128
128
 
129
129
  @property({ type: Boolean })
130
130
  _showCategories!: boolean;
@@ -1,7 +1,8 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import type { Slot } from "@ui5/webcomponents-base/dist/UI5Element.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
- import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
5
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
5
6
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
7
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
7
8
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
@@ -215,7 +216,7 @@ class UDExMastheadProfileMenu extends UI5Element {
215
216
  * @public
216
217
  */
217
218
  @slot({ type: Node, "default": false })
218
- message!: Array<Node>;
219
+ message!: Slot<Node>;
219
220
 
220
221
  /**
221
222
  * Slot for logout button.
@@ -223,7 +224,7 @@ class UDExMastheadProfileMenu extends UI5Element {
223
224
  * @public
224
225
  */
225
226
  @slot({ type: HTMLElement })
226
- logoutButton!: Array<Node>;
227
+ logoutButton!: Slot<Node>;
227
228
 
228
229
  @i18n("@sapudex/web-components")
229
230
  static i18nBundle: I18nBundle;
@@ -1,9 +1,9 @@
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 slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
4
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
5
5
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
6
- import type { DefaultSlot, ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
6
+ import type { DefaultSlot, Slot, ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
7
7
  import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
8
8
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
9
9
  import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
@@ -259,7 +259,7 @@ class UDExMastheadShell extends UI5Element {
259
259
  * @public
260
260
  */
261
261
  @slot({ type: Node })
262
- countrySelector!: Array<UDExMastheadItem>;
262
+ countrySelector!: Slot<UDExMastheadItem>;
263
263
 
264
264
  /**
265
265
  * Slot for mobile menu
@@ -267,7 +267,7 @@ class UDExMastheadShell extends UI5Element {
267
267
  * @public
268
268
  */
269
269
  @slot({ type: HTMLElement })
270
- mobileMenu!: Array<Node>;
270
+ mobileMenu!: Slot<Node>;
271
271
 
272
272
  /**
273
273
  * Slot for main menu items.
@@ -285,7 +285,7 @@ class UDExMastheadShell extends UI5Element {
285
285
  * @public
286
286
  */
287
287
  @slot({ type: Node })
288
- search!: Array<Node>;
288
+ search!: Slot<Node>;
289
289
 
290
290
  /**
291
291
  * Slot for 'Explore SAP' menu
@@ -293,7 +293,7 @@ class UDExMastheadShell extends UI5Element {
293
293
  * @public
294
294
  */
295
295
  @slot({ type: HTMLElement })
296
- exploreSAP!: Array<UDExMastheadItem>;
296
+ exploreSAP!: Slot<UDExMastheadItem>;
297
297
 
298
298
  /**
299
299
  * Slot for cart menu
@@ -301,7 +301,7 @@ class UDExMastheadShell extends UI5Element {
301
301
  * @public
302
302
  */
303
303
  @slot({ type: HTMLElement })
304
- cart!: Array<UDExMastheadItem>;
304
+ cart!: Slot<UDExMastheadItem>;
305
305
 
306
306
  /**
307
307
  * Slot for joule menu
@@ -309,7 +309,7 @@ class UDExMastheadShell extends UI5Element {
309
309
  * @public
310
310
  */
311
311
  @slot({ type: HTMLElement })
312
- joule!: Array<UDExMastheadItem>;
312
+ joule!: Slot<UDExMastheadItem>;
313
313
 
314
314
  /**
315
315
  * Slot for avatar
@@ -317,7 +317,7 @@ class UDExMastheadShell extends UI5Element {
317
317
  * @public
318
318
  */
319
319
  @slot({ type: HTMLElement })
320
- profile!: Array<UDExMastheadItem>;
320
+ profile!: Slot<UDExMastheadItem>;
321
321
 
322
322
  /**
323
323
  * Slot for support
@@ -325,7 +325,7 @@ class UDExMastheadShell extends UI5Element {
325
325
  * @public
326
326
  */
327
327
  @slot({ type: HTMLElement })
328
- support!: Array<UDExMastheadItem>;
328
+ support!: Slot<UDExMastheadItem>;
329
329
 
330
330
  /**
331
331
  * Defines URL to homepage. It will be used as a link on a logo and a site label
@@ -5,7 +5,7 @@ import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
5
5
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
6
6
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
7
7
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
8
- import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
8
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
9
9
  import type { VimeoPlayer } from "./MediaPlayerVimeo.js";
10
10
  import mapLangFile from "./mediaPlayerLanguageMapping.js";
11
11
  import type UDExMediaPlayerYoutube from "./MediaPlayerYoutube.js";
@@ -264,7 +264,7 @@ class UDExMediaPlayer extends UI5Element {
264
264
  video50!: boolean;
265
265
  video75!: boolean;
266
266
  videoCompleted!: boolean;
267
- videoStart!: boolean;
267
+ _embedVideoStartFired = false;
268
268
  videoReady!: boolean;
269
269
  videoProgress!: number;
270
270
  private _pendingPlugins: Array<{ name: string; plugin: (...args: any[]) => any }> = [];
@@ -371,6 +371,9 @@ class UDExMediaPlayer extends UI5Element {
371
371
  });
372
372
 
373
373
  player.on("ended", () => {
374
+ this.video25 = false;
375
+ this.video50 = false;
376
+ this.video75 = false;
374
377
  this.fireDecoratorEvent("videoComplete");
375
378
  });
376
379
 
@@ -611,15 +614,19 @@ class UDExMediaPlayer extends UI5Element {
611
614
  }
612
615
 
613
616
  handleEmbedVideoPlaying = (embedEvent: CustomEvent) => {
614
- if (!this.videoStart) {
617
+ if (!this._embedVideoStartFired) {
615
618
  this.fireDecoratorEvent("videoStart");
616
- this.videoStart = true;
619
+ this._embedVideoStartFired = true;
617
620
  }
618
621
  const playedTime = Math.round(embedEvent.detail.percentPlayed as number);
619
622
  this.calculateVideoProgress(playedTime);
620
623
  };
621
624
 
622
625
  handleEmbedVideoEnded() {
626
+ this._embedVideoStartFired = false;
627
+ this.video25 = false;
628
+ this.video50 = false;
629
+ this.video75 = false;
623
630
  this.fireDecoratorEvent("videoComplete");
624
631
  }
625
632
 
@@ -39,6 +39,13 @@ type UDExMediaPlayerVimeoPlayingEventDetail = {
39
39
  styles: [MediaPlayerCss],
40
40
  template: MediaPlayerVimeoTemplate,
41
41
  })
42
+ /**
43
+ * Fires when video starts playing for the first time or is replayed after ending
44
+ *
45
+ * @allowPreventDefault
46
+ * @public
47
+ */
48
+ @event("videoStart", { bubbles: true })
42
49
  /**
43
50
  * Fires when video is ready
44
51
  *
@@ -70,6 +77,7 @@ type UDExMediaPlayerVimeoPlayingEventDetail = {
70
77
  @event("playing", { bubbles: true })
71
78
  class UDExMediaPlayerVimeo extends UI5Element {
72
79
  eventDetails!: {
80
+ "videoStart": void,
73
81
  "ready": void,
74
82
  "ended": void,
75
83
  "pause": void,
@@ -128,6 +136,25 @@ class UDExMediaPlayerVimeo extends UI5Element {
128
136
  fluidMode!: boolean;
129
137
 
130
138
  player!: Player;
139
+ private _hasStarted = false;
140
+ private _replayPending = false;
141
+
142
+ _onVimeoPlay = () => {
143
+ if (!this._hasStarted || this._replayPending) {
144
+ this.fireDecoratorEvent("videoStart");
145
+ this._hasStarted = true;
146
+ this._replayPending = false;
147
+ }
148
+ };
149
+
150
+ _onVimeoPause = () => {
151
+ this.fireDecoratorEvent("pause");
152
+ };
153
+
154
+ _onVimeoEnded = () => {
155
+ this._replayPending = true;
156
+ this.fireDecoratorEvent("ended");
157
+ };
131
158
 
132
159
  setupPlayer = () => {
133
160
  const iframe = this.shadowRoot?.querySelector("iframe");
@@ -136,17 +163,15 @@ class UDExMediaPlayerVimeo extends UI5Element {
136
163
  }
137
164
  this.player = new Player(iframe);
138
165
 
166
+ this.player.on("play", this._onVimeoPlay);
167
+
139
168
  this.player.on("timeupdate", e => {
140
169
  this.fireDecoratorEvent("playing", { percentPlayed: e.percent * 100 });
141
170
  });
142
171
 
143
- this.player.on("pause", () => {
144
- this.fireDecoratorEvent("pause");
145
- });
172
+ this.player.on("pause", this._onVimeoPause);
146
173
 
147
- this.player.on("ended", () => {
148
- this.fireDecoratorEvent("ended");
149
- });
174
+ this.player.on("ended", this._onVimeoEnded);
150
175
 
151
176
  this.player.on("loaded", () => {
152
177
  this.fireDecoratorEvent("ready");
@@ -1,3 +1,4 @@
1
+ /// <reference types="youtube" />
1
2
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.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";
@@ -61,6 +62,13 @@ type UDExMediaPlayerYoutubeBaseEventDetails = {
61
62
  styles: [MediaPlayerCss, MediaPlayerYoutubeCss],
62
63
  template: MediaPlayerYoutubeTemplate,
63
64
  })
65
+ /**
66
+ * Fires when video starts playing for the first time or is replayed after ending
67
+ *
68
+ * @allowPreventDefault
69
+ * @public
70
+ */
71
+ @event("videoStart", { bubbles: true })
64
72
  /**
65
73
  * Fires when video is ready
66
74
  *
@@ -94,6 +102,7 @@ type UDExMediaPlayerYoutubeBaseEventDetails = {
94
102
  @event("playing", { bubbles: true })
95
103
  class UDExMediaPlayerYoutube extends UI5Element {
96
104
  eventDetails!: {
105
+ "videoStart": void,
97
106
  "ready": void,
98
107
  "ended": UDExMediaPlayerYoutubeBaseEventDetails,
99
108
  "pause": UDExMediaPlayerYoutubeBaseEventDetails,
@@ -147,6 +156,8 @@ class UDExMediaPlayerYoutube extends UI5Element {
147
156
  private youtubePlayer!: YT.Player;
148
157
  private checkInterval?: number;
149
158
  private videoDuration: number = 0;
159
+ private _hasStarted = false;
160
+ private _replayPending = false;
150
161
 
151
162
  get videoId(): string {
152
163
  if (!this.source) {
@@ -221,16 +232,24 @@ class UDExMediaPlayerYoutube extends UI5Element {
221
232
  const { data } = ytevent;
222
233
  const { PLAYING, PAUSED, ENDED } = window.YT.PlayerState;
223
234
 
224
- if (data === PLAYING && !this.checkInterval) {
225
- this.checkInterval = window.setInterval(() => {
226
- this.checkVideoProgress();
227
- }, CHECK_INTERVAL_TIME);
228
- } else if (data !== PLAYING && this.checkInterval) {
235
+ if (data === PLAYING) {
236
+ if (!this._hasStarted || this._replayPending) {
237
+ this.fireDecoratorEvent("videoStart");
238
+ this._hasStarted = true;
239
+ this._replayPending = false;
240
+ }
241
+ if (!this.checkInterval) {
242
+ this.checkInterval = window.setInterval(() => {
243
+ this.checkVideoProgress();
244
+ }, CHECK_INTERVAL_TIME);
245
+ }
246
+ } else if (this.checkInterval) {
229
247
  clearInterval(this.checkInterval);
230
248
  this.checkInterval = undefined;
231
249
  }
232
250
 
233
251
  if (data === ENDED) {
252
+ this._replayPending = true;
234
253
  this.fireDecoratorEvent("ended", { ytevent });
235
254
  }
236
255