@telus-uds/components-web 3.4.0 → 4.0.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 (368) hide show
  1. package/.eslintrc.cjs +7 -1
  2. package/CHANGELOG.md +22 -2
  3. package/jest.config.cjs +1 -1
  4. package/lib/cjs/Badge/Badge.js +128 -0
  5. package/lib/cjs/Badge/index.js +9 -0
  6. package/lib/cjs/BlockQuote/BlockQuote.js +256 -0
  7. package/lib/cjs/BlockQuote/index.js +9 -0
  8. package/lib/cjs/Breadcrumbs/Breadcrumbs.js +264 -0
  9. package/lib/cjs/Breadcrumbs/Item/Item.js +180 -0
  10. package/lib/cjs/Breadcrumbs/index.js +13 -0
  11. package/lib/cjs/Callout/Callout.js +141 -0
  12. package/lib/cjs/Callout/index.js +9 -0
  13. package/lib/cjs/Card/Card.js +257 -0
  14. package/lib/cjs/Card/CardContent.js +97 -0
  15. package/lib/cjs/Card/CardFooter.js +85 -0
  16. package/lib/cjs/Card/index.js +9 -0
  17. package/lib/cjs/Countdown/Countdown.js +268 -0
  18. package/lib/cjs/Countdown/Segment.js +108 -0
  19. package/lib/cjs/Countdown/constants.js +10 -0
  20. package/lib/cjs/Countdown/dictionary.js +28 -0
  21. package/lib/cjs/Countdown/index.js +9 -0
  22. package/lib/cjs/Countdown/types.js +31 -0
  23. package/lib/cjs/Countdown/useCountdown.js +32 -0
  24. package/lib/cjs/DatePicker/CalendarContainer.js +214 -0
  25. package/lib/cjs/DatePicker/DatePicker.js +525 -0
  26. package/lib/cjs/DatePicker/dictionary.js +125 -0
  27. package/lib/cjs/DatePicker/index.js +9 -0
  28. package/lib/cjs/DatePicker/reactDatesCss.js +9 -0
  29. package/lib/cjs/Disclaimer/Disclaimer.js +61 -0
  30. package/lib/cjs/Disclaimer/index.js +13 -0
  31. package/lib/cjs/Footnote/Footnote.js +637 -0
  32. package/lib/cjs/Footnote/FootnoteLink.js +125 -0
  33. package/lib/cjs/Footnote/dictionary.js +18 -0
  34. package/lib/cjs/Footnote/index.js +11 -0
  35. package/lib/cjs/IconButton/IconButton.js +62 -0
  36. package/lib/cjs/IconButton/index.js +9 -0
  37. package/lib/cjs/Image/Image.js +90 -0
  38. package/lib/cjs/Image/index.js +20 -0
  39. package/lib/cjs/Image/server.js +11 -0
  40. package/lib/cjs/List/List.js +8 -0
  41. package/lib/cjs/List/ListItem.js +34 -0
  42. package/lib/cjs/List/index.js +11 -0
  43. package/lib/cjs/NavigationBar/NavigationBar.js +282 -0
  44. package/lib/cjs/NavigationBar/NavigationItem.js +94 -0
  45. package/lib/cjs/NavigationBar/NavigationSubMenu.js +164 -0
  46. package/lib/cjs/NavigationBar/collapseItems.js +43 -0
  47. package/lib/cjs/NavigationBar/index.js +11 -0
  48. package/lib/cjs/NavigationBar/resolveItemSelection.js +22 -0
  49. package/lib/cjs/OptimizeImage/OptimizeImage.js +99 -0
  50. package/lib/cjs/OptimizeImage/index.js +9 -0
  51. package/lib/cjs/OptimizeImage/utils/getFallbackUrl.js +14 -0
  52. package/lib/cjs/OptimizeImage/utils/getImageUrls.js +19 -0
  53. package/lib/cjs/OptimizeImage/utils/getOptimizedUrl.js +24 -0
  54. package/lib/cjs/OptimizeImage/utils/hasWebpSupport.js +34 -0
  55. package/lib/cjs/OptimizeImage/utils/index.js +34 -0
  56. package/lib/cjs/OptimizeImage/utils/isSvgUrl.js +9 -0
  57. package/lib/cjs/OrderedList/Item.js +151 -0
  58. package/lib/cjs/OrderedList/ItemBase.js +34 -0
  59. package/lib/cjs/OrderedList/OrderedList.js +92 -0
  60. package/lib/cjs/OrderedList/OrderedListBase.js +52 -0
  61. package/lib/cjs/OrderedList/constants.js +8 -0
  62. package/lib/cjs/OrderedList/index.js +11 -0
  63. package/lib/cjs/Paragraph/Paragraph.js +97 -0
  64. package/lib/cjs/Paragraph/index.js +9 -0
  65. package/lib/cjs/PreviewCard/AuthorDate.js +63 -0
  66. package/lib/cjs/PreviewCard/PreviewCard.js +215 -0
  67. package/lib/cjs/PreviewCard/index.js +9 -0
  68. package/lib/cjs/PriceLockup/PriceLockup.js +356 -0
  69. package/lib/cjs/PriceLockup/index.js +9 -0
  70. package/lib/cjs/PriceLockup/tokens.js +66 -0
  71. package/lib/cjs/Progress/ProgressBar.js +99 -0
  72. package/lib/cjs/Progress/index.js +11 -0
  73. package/lib/cjs/QuantitySelector/QuantitySelector.js +267 -0
  74. package/lib/cjs/QuantitySelector/SideButton.js +77 -0
  75. package/lib/cjs/QuantitySelector/dictionary.js +32 -0
  76. package/lib/cjs/QuantitySelector/index.js +9 -0
  77. package/lib/cjs/QuantitySelector/styles.js +16 -0
  78. package/lib/cjs/ResponsiveImage/ResponsiveImage.js +107 -0
  79. package/lib/cjs/ResponsiveImage/index.js +9 -0
  80. package/lib/cjs/Ribbon/Ribbon.js +222 -0
  81. package/lib/cjs/Ribbon/index.js +9 -0
  82. package/lib/cjs/SkeletonProvider/SkeletonImage.js +45 -0
  83. package/lib/cjs/SkeletonProvider/SkeletonProvider.js +63 -0
  84. package/lib/cjs/SkeletonProvider/SkeletonTypography.js +44 -0
  85. package/lib/cjs/SkeletonProvider/index.js +9 -0
  86. package/lib/cjs/Span/Span.js +79 -0
  87. package/lib/cjs/Span/index.js +9 -0
  88. package/lib/cjs/Spinner/Spinner.js +221 -0
  89. package/lib/cjs/Spinner/SpinnerContent.js +100 -0
  90. package/lib/cjs/Spinner/constants.js +10 -0
  91. package/lib/cjs/Spinner/index.js +9 -0
  92. package/lib/cjs/StoryCard/StoryCard.js +219 -0
  93. package/lib/cjs/StoryCard/index.js +9 -0
  94. package/lib/cjs/Table/Body.js +24 -0
  95. package/lib/cjs/Table/Cell.js +187 -0
  96. package/lib/cjs/Table/Header.js +32 -0
  97. package/lib/cjs/Table/Row.js +41 -0
  98. package/lib/cjs/Table/SubHeading.js +30 -0
  99. package/lib/cjs/Table/Table.js +124 -0
  100. package/lib/cjs/Table/index.js +19 -0
  101. package/lib/cjs/TermsAndConditions/ExpandCollapse.js +160 -0
  102. package/lib/cjs/TermsAndConditions/TermsAndConditions.js +283 -0
  103. package/lib/cjs/TermsAndConditions/dictionary.js +22 -0
  104. package/lib/cjs/TermsAndConditions/index.js +13 -0
  105. package/lib/cjs/Testimonial/Testimonial.js +240 -0
  106. package/lib/cjs/Testimonial/index.js +9 -0
  107. package/lib/cjs/Toast/Toast.js +165 -0
  108. package/lib/cjs/Toast/index.js +9 -0
  109. package/lib/cjs/Video/ControlBar/ControlBar.js +294 -0
  110. package/lib/cjs/Video/ControlBar/Controls/VideoButton/VideoButton.js +76 -0
  111. package/lib/cjs/Video/ControlBar/Controls/VideoMenu/VideoMenu.js +169 -0
  112. package/lib/cjs/Video/ControlBar/Controls/VideoProgressBar/VideoProgressBar.js +211 -0
  113. package/lib/cjs/Video/ControlBar/Controls/VolumeSlider/VolumeSlider.js +197 -0
  114. package/lib/cjs/Video/MiddleControlButton/MiddleControlButton.js +78 -0
  115. package/lib/cjs/Video/Video.js +964 -0
  116. package/lib/cjs/Video/index.js +9 -0
  117. package/lib/cjs/Video/videoText.js +61 -0
  118. package/lib/cjs/VideoPicker/VideoPicker.js +197 -0
  119. package/lib/cjs/VideoPicker/VideoPickerPlayer.js +54 -0
  120. package/lib/cjs/VideoPicker/VideoPickerThumbnail.js +223 -0
  121. package/lib/cjs/VideoPicker/VideoSlider.js +88 -0
  122. package/lib/cjs/VideoPicker/index.js +9 -0
  123. package/lib/cjs/VideoPicker/videoPropType.js +17 -0
  124. package/lib/cjs/WaffleGrid/WaffleGrid.js +164 -0
  125. package/lib/cjs/WaffleGrid/index.js +9 -0
  126. package/lib/cjs/WebVideo/WebVideo.js +197 -0
  127. package/lib/cjs/WebVideo/index.js +9 -0
  128. package/lib/cjs/WebVideo/utils/index.js +57 -0
  129. package/lib/cjs/baseExports.js +438 -0
  130. package/lib/cjs/index.js +317 -0
  131. package/lib/cjs/server.js +13 -0
  132. package/lib/cjs/shared/ConditionalWrapper/ConditionalWrapper.js +29 -0
  133. package/lib/cjs/shared/ConditionalWrapper/index.js +9 -0
  134. package/lib/cjs/shared/FullBleedContent/FullBleedContent.js +108 -0
  135. package/lib/cjs/shared/FullBleedContent/getFullBleedBorderRadius.js +61 -0
  136. package/lib/cjs/shared/FullBleedContent/index.js +23 -0
  137. package/lib/cjs/shared/FullBleedContent/useFullBleedContentProps.js +61 -0
  138. package/lib/cjs/shared/VideoSplash/SplashButton/SplashButton.js +91 -0
  139. package/lib/cjs/shared/VideoSplash/SplashButtonWithDetails/SplashButtonWithDetails.js +229 -0
  140. package/lib/cjs/shared/VideoSplash/VideoSplash.js +72 -0
  141. package/lib/cjs/shared/VideoSplash/helpers.js +32 -0
  142. package/lib/cjs/utils/index.js +88 -0
  143. package/lib/cjs/utils/isElementFocusable.js +14 -0
  144. package/lib/cjs/utils/logger.js +24 -0
  145. package/lib/cjs/utils/media.js +45 -0
  146. package/lib/cjs/utils/renderStructuredContent.js +71 -0
  147. package/lib/cjs/utils/scrollToAnchor.js +25 -0
  148. package/lib/cjs/utils/ssr.js +50 -0
  149. package/lib/cjs/utils/theming/get-theme-from-server.js +24 -0
  150. package/lib/cjs/utils/theming/with-client-theme.js +31 -0
  151. package/lib/cjs/utils/theming/with-server-theme.js +33 -0
  152. package/lib/cjs/utils/transforms.js +11 -0
  153. package/lib/cjs/utils/useOverlaidPosition.js +222 -0
  154. package/lib/cjs/utils/useTypographyTheme.js +30 -0
  155. package/lib/{Badge → esm/Badge}/Badge.js +11 -21
  156. package/lib/{BlockQuote → esm/BlockQuote}/BlockQuote.js +17 -31
  157. package/lib/{Breadcrumbs → esm/Breadcrumbs}/Breadcrumbs.js +6 -5
  158. package/lib/{Breadcrumbs → esm/Breadcrumbs}/Item/Item.js +10 -6
  159. package/lib/{Callout → esm/Callout}/Callout.js +6 -5
  160. package/lib/{Card → esm/Card}/Card.js +5 -5
  161. package/lib/{Card → esm/Card}/CardContent.js +6 -5
  162. package/lib/{Card → esm/Card}/CardFooter.js +6 -5
  163. package/lib/{Countdown → esm/Countdown}/Countdown.js +53 -32
  164. package/lib/{Countdown → esm/Countdown}/Segment.js +6 -6
  165. package/lib/{DatePicker → esm/DatePicker}/CalendarContainer.js +5 -5
  166. package/lib/{DatePicker → esm/DatePicker}/DatePicker.js +18 -12
  167. package/lib/esm/DatePicker/reactDatesCss.js +3 -0
  168. package/lib/{Disclaimer → esm/Disclaimer}/Disclaimer.js +6 -5
  169. package/lib/{Footnote → esm/Footnote}/Footnote.js +39 -15
  170. package/lib/{Footnote → esm/Footnote}/FootnoteLink.js +6 -5
  171. package/lib/{NavigationBar → esm/NavigationBar}/NavigationBar.js +6 -5
  172. package/lib/{NavigationBar → esm/NavigationBar}/NavigationItem.js +6 -5
  173. package/lib/{OrderedList → esm/OrderedList}/Item.js +10 -6
  174. package/lib/{OrderedList → esm/OrderedList}/ItemBase.js +5 -5
  175. package/lib/{OrderedList → esm/OrderedList}/OrderedList.js +6 -5
  176. package/lib/{OrderedList → esm/OrderedList}/OrderedListBase.js +5 -5
  177. package/lib/{Paragraph → esm/Paragraph}/Paragraph.js +8 -16
  178. package/lib/{PreviewCard → esm/PreviewCard}/PreviewCard.js +10 -7
  179. package/lib/{PriceLockup → esm/PriceLockup}/PriceLockup.js +59 -69
  180. package/lib/{Progress → esm/Progress}/ProgressBar.js +6 -6
  181. package/lib/esm/QuantitySelector/styles.js +9 -0
  182. package/lib/{Ribbon → esm/Ribbon}/Ribbon.js +31 -57
  183. package/lib/{Span → esm/Span}/Span.js +7 -6
  184. package/lib/{Spinner → esm/Spinner}/Spinner.js +18 -8
  185. package/lib/{Spinner → esm/Spinner}/SpinnerContent.js +6 -5
  186. package/lib/{StoryCard → esm/StoryCard}/StoryCard.js +10 -7
  187. package/lib/{Table → esm/Table}/Cell.js +16 -45
  188. package/lib/esm/Table/Row.js +34 -0
  189. package/lib/{Table → esm/Table}/Table.js +16 -17
  190. package/lib/{TermsAndConditions → esm/TermsAndConditions}/ExpandCollapse.js +13 -7
  191. package/lib/{TermsAndConditions → esm/TermsAndConditions}/TermsAndConditions.js +22 -9
  192. package/lib/{Testimonial → esm/Testimonial}/Testimonial.js +26 -10
  193. package/lib/{Toast → esm/Toast}/Toast.js +13 -64
  194. package/lib/{Video → esm/Video}/ControlBar/ControlBar.js +18 -8
  195. package/lib/{Video → esm/Video}/ControlBar/Controls/VideoButton/VideoButton.js +6 -5
  196. package/lib/{Video → esm/Video}/ControlBar/Controls/VideoMenu/VideoMenu.js +14 -7
  197. package/lib/{Video → esm/Video}/ControlBar/Controls/VideoProgressBar/VideoProgressBar.js +14 -7
  198. package/lib/{Video → esm/Video}/ControlBar/Controls/VolumeSlider/VolumeSlider.js +10 -6
  199. package/lib/{Video → esm/Video}/MiddleControlButton/MiddleControlButton.js +6 -5
  200. package/lib/{Video → esm/Video}/Video.js +26 -10
  201. package/lib/{VideoPicker → esm/VideoPicker}/VideoPicker.js +20 -44
  202. package/lib/{VideoPicker → esm/VideoPicker}/VideoPickerThumbnail.js +18 -52
  203. package/lib/{WaffleGrid → esm/WaffleGrid}/WaffleGrid.js +14 -7
  204. package/lib/{WebVideo → esm/WebVideo}/WebVideo.js +14 -9
  205. package/lib/{index.js → esm/index.js} +1 -1
  206. package/lib/{shared → esm/shared}/FullBleedContent/FullBleedContent.js +5 -5
  207. package/lib/{shared → esm/shared}/VideoSplash/SplashButton/SplashButton.js +9 -6
  208. package/lib/{shared → esm/shared}/VideoSplash/SplashButtonWithDetails/SplashButtonWithDetails.js +17 -8
  209. package/lib/{shared → esm/shared}/VideoSplash/VideoSplash.js +6 -5
  210. package/lib/{utils → esm/utils}/index.js +1 -2
  211. package/lib/{utils → esm/utils}/ssr.js +1 -4
  212. package/package.json +17 -16
  213. package/src/Badge/Badge.jsx +2 -3
  214. package/src/BlockQuote/BlockQuote.jsx +2 -3
  215. package/src/Breadcrumbs/Breadcrumbs.jsx +2 -3
  216. package/src/Breadcrumbs/Item/Item.jsx +2 -3
  217. package/src/Callout/Callout.jsx +2 -4
  218. package/src/Card/Card.jsx +1 -3
  219. package/src/Card/CardContent.jsx +2 -3
  220. package/src/Card/CardFooter.jsx +2 -3
  221. package/src/Countdown/Countdown.jsx +62 -36
  222. package/src/Countdown/Segment.jsx +1 -3
  223. package/src/DatePicker/CalendarContainer.jsx +1 -3
  224. package/src/DatePicker/DatePicker.jsx +2 -3
  225. package/src/DatePicker/reactDatesCss.js +1 -3
  226. package/src/Disclaimer/Disclaimer.jsx +2 -3
  227. package/src/Footnote/Footnote.jsx +2 -10
  228. package/src/Footnote/FootnoteLink.jsx +2 -3
  229. package/src/NavigationBar/NavigationBar.jsx +2 -3
  230. package/src/NavigationBar/NavigationItem.jsx +2 -3
  231. package/src/OrderedList/Item.jsx +2 -3
  232. package/src/OrderedList/ItemBase.jsx +1 -3
  233. package/src/OrderedList/OrderedList.jsx +2 -3
  234. package/src/OrderedList/OrderedListBase.jsx +1 -3
  235. package/src/Paragraph/Paragraph.jsx +2 -4
  236. package/src/PreviewCard/PreviewCard.jsx +1 -3
  237. package/src/PriceLockup/PriceLockup.jsx +2 -3
  238. package/src/Progress/ProgressBar.jsx +1 -3
  239. package/src/QuantitySelector/styles.js +1 -3
  240. package/src/Ribbon/Ribbon.jsx +2 -3
  241. package/src/Span/Span.jsx +2 -4
  242. package/src/Spinner/Spinner.jsx +2 -3
  243. package/src/Spinner/SpinnerContent.jsx +2 -3
  244. package/src/StoryCard/StoryCard.jsx +1 -3
  245. package/src/Table/Cell.jsx +4 -5
  246. package/src/Table/Row.jsx +13 -2
  247. package/src/Table/Table.jsx +14 -5
  248. package/src/TermsAndConditions/ExpandCollapse.jsx +1 -3
  249. package/src/TermsAndConditions/TermsAndConditions.jsx +2 -3
  250. package/src/Testimonial/Testimonial.jsx +2 -3
  251. package/src/Toast/Toast.jsx +2 -3
  252. package/src/Video/ControlBar/ControlBar.jsx +2 -4
  253. package/src/Video/ControlBar/Controls/VideoButton/VideoButton.jsx +2 -4
  254. package/src/Video/ControlBar/Controls/VideoMenu/VideoMenu.jsx +2 -4
  255. package/src/Video/ControlBar/Controls/VideoProgressBar/VideoProgressBar.jsx +2 -4
  256. package/src/Video/ControlBar/Controls/VolumeSlider/VolumeSlider.jsx +2 -4
  257. package/src/Video/MiddleControlButton/MiddleControlButton.jsx +2 -4
  258. package/src/Video/Video.jsx +2 -4
  259. package/src/VideoPicker/VideoPicker.jsx +2 -4
  260. package/src/VideoPicker/VideoPickerThumbnail.jsx +1 -3
  261. package/src/WaffleGrid/WaffleGrid.jsx +2 -3
  262. package/src/WebVideo/WebVideo.jsx +3 -4
  263. package/src/index.js +1 -1
  264. package/src/shared/FullBleedContent/FullBleedContent.jsx +1 -3
  265. package/src/shared/VideoSplash/SplashButton/SplashButton.jsx +1 -3
  266. package/src/shared/VideoSplash/SplashButtonWithDetails/SplashButtonWithDetails.jsx +1 -4
  267. package/src/shared/VideoSplash/VideoSplash.jsx +2 -3
  268. package/src/utils/index.js +1 -3
  269. package/src/utils/ssr.js +1 -2
  270. package/lib/DatePicker/reactDatesCss.js +0 -830
  271. package/lib/QuantitySelector/styles.js +0 -18
  272. package/lib/Table/Row.js +0 -19
  273. package/lib/utils/theming/styled-components.js +0 -26
  274. package/src/utils/theming/styled-components.js +0 -23
  275. /package/lib/{Badge → esm/Badge}/index.js +0 -0
  276. /package/lib/{BlockQuote → esm/BlockQuote}/index.js +0 -0
  277. /package/lib/{Breadcrumbs → esm/Breadcrumbs}/index.js +0 -0
  278. /package/lib/{Callout → esm/Callout}/index.js +0 -0
  279. /package/lib/{Card → esm/Card}/index.js +0 -0
  280. /package/lib/{Countdown → esm/Countdown}/constants.js +0 -0
  281. /package/lib/{Countdown → esm/Countdown}/dictionary.js +0 -0
  282. /package/lib/{Countdown → esm/Countdown}/index.js +0 -0
  283. /package/lib/{Countdown → esm/Countdown}/types.js +0 -0
  284. /package/lib/{Countdown → esm/Countdown}/useCountdown.js +0 -0
  285. /package/lib/{DatePicker → esm/DatePicker}/dictionary.js +0 -0
  286. /package/lib/{DatePicker → esm/DatePicker}/index.js +0 -0
  287. /package/lib/{Disclaimer → esm/Disclaimer}/index.js +0 -0
  288. /package/lib/{Footnote → esm/Footnote}/dictionary.js +0 -0
  289. /package/lib/{Footnote → esm/Footnote}/index.js +0 -0
  290. /package/lib/{IconButton → esm/IconButton}/IconButton.js +0 -0
  291. /package/lib/{IconButton → esm/IconButton}/index.js +0 -0
  292. /package/lib/{Image → esm/Image}/Image.js +0 -0
  293. /package/lib/{Image → esm/Image}/index.js +0 -0
  294. /package/lib/{Image → esm/Image}/server.js +0 -0
  295. /package/lib/{List → esm/List}/List.js +0 -0
  296. /package/lib/{List → esm/List}/ListItem.js +0 -0
  297. /package/lib/{List → esm/List}/index.js +0 -0
  298. /package/lib/{NavigationBar → esm/NavigationBar}/NavigationSubMenu.js +0 -0
  299. /package/lib/{NavigationBar → esm/NavigationBar}/collapseItems.js +0 -0
  300. /package/lib/{NavigationBar → esm/NavigationBar}/index.js +0 -0
  301. /package/lib/{NavigationBar → esm/NavigationBar}/resolveItemSelection.js +0 -0
  302. /package/lib/{OptimizeImage → esm/OptimizeImage}/OptimizeImage.js +0 -0
  303. /package/lib/{OptimizeImage → esm/OptimizeImage}/index.js +0 -0
  304. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/getFallbackUrl.js +0 -0
  305. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/getImageUrls.js +0 -0
  306. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/getOptimizedUrl.js +0 -0
  307. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/hasWebpSupport.js +0 -0
  308. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/index.js +0 -0
  309. /package/lib/{OptimizeImage → esm/OptimizeImage}/utils/isSvgUrl.js +0 -0
  310. /package/lib/{OrderedList → esm/OrderedList}/constants.js +0 -0
  311. /package/lib/{OrderedList → esm/OrderedList}/index.js +0 -0
  312. /package/lib/{Paragraph → esm/Paragraph}/index.js +0 -0
  313. /package/lib/{PreviewCard → esm/PreviewCard}/AuthorDate.js +0 -0
  314. /package/lib/{PreviewCard → esm/PreviewCard}/index.js +0 -0
  315. /package/lib/{PriceLockup → esm/PriceLockup}/index.js +0 -0
  316. /package/lib/{PriceLockup → esm/PriceLockup}/tokens.js +0 -0
  317. /package/lib/{Progress → esm/Progress}/index.js +0 -0
  318. /package/lib/{QuantitySelector → esm/QuantitySelector}/QuantitySelector.js +0 -0
  319. /package/lib/{QuantitySelector → esm/QuantitySelector}/SideButton.js +0 -0
  320. /package/lib/{QuantitySelector → esm/QuantitySelector}/dictionary.js +0 -0
  321. /package/lib/{QuantitySelector → esm/QuantitySelector}/index.js +0 -0
  322. /package/lib/{ResponsiveImage → esm/ResponsiveImage}/ResponsiveImage.js +0 -0
  323. /package/lib/{ResponsiveImage → esm/ResponsiveImage}/index.js +0 -0
  324. /package/lib/{Ribbon → esm/Ribbon}/index.js +0 -0
  325. /package/lib/{SkeletonProvider → esm/SkeletonProvider}/SkeletonImage.js +0 -0
  326. /package/lib/{SkeletonProvider → esm/SkeletonProvider}/SkeletonProvider.js +0 -0
  327. /package/lib/{SkeletonProvider → esm/SkeletonProvider}/SkeletonTypography.js +0 -0
  328. /package/lib/{SkeletonProvider → esm/SkeletonProvider}/index.js +0 -0
  329. /package/lib/{Span → esm/Span}/index.js +0 -0
  330. /package/lib/{Spinner → esm/Spinner}/constants.js +0 -0
  331. /package/lib/{Spinner → esm/Spinner}/index.js +0 -0
  332. /package/lib/{StoryCard → esm/StoryCard}/index.js +0 -0
  333. /package/lib/{Table → esm/Table}/Body.js +0 -0
  334. /package/lib/{Table → esm/Table}/Header.js +0 -0
  335. /package/lib/{Table → esm/Table}/SubHeading.js +0 -0
  336. /package/lib/{Table → esm/Table}/index.js +0 -0
  337. /package/lib/{TermsAndConditions → esm/TermsAndConditions}/dictionary.js +0 -0
  338. /package/lib/{TermsAndConditions → esm/TermsAndConditions}/index.js +0 -0
  339. /package/lib/{Testimonial → esm/Testimonial}/index.js +0 -0
  340. /package/lib/{Toast → esm/Toast}/index.js +0 -0
  341. /package/lib/{Video → esm/Video}/index.js +0 -0
  342. /package/lib/{Video → esm/Video}/videoText.js +0 -0
  343. /package/lib/{VideoPicker → esm/VideoPicker}/VideoPickerPlayer.js +0 -0
  344. /package/lib/{VideoPicker → esm/VideoPicker}/VideoSlider.js +0 -0
  345. /package/lib/{VideoPicker → esm/VideoPicker}/index.js +0 -0
  346. /package/lib/{VideoPicker → esm/VideoPicker}/videoPropType.js +0 -0
  347. /package/lib/{WaffleGrid → esm/WaffleGrid}/index.js +0 -0
  348. /package/lib/{WebVideo → esm/WebVideo}/index.js +0 -0
  349. /package/lib/{WebVideo → esm/WebVideo}/utils/index.js +0 -0
  350. /package/lib/{baseExports.js → esm/baseExports.js} +0 -0
  351. /package/lib/{server.js → esm/server.js} +0 -0
  352. /package/lib/{shared → esm/shared}/ConditionalWrapper/ConditionalWrapper.js +0 -0
  353. /package/lib/{shared → esm/shared}/ConditionalWrapper/index.js +0 -0
  354. /package/lib/{shared → esm/shared}/FullBleedContent/getFullBleedBorderRadius.js +0 -0
  355. /package/lib/{shared → esm/shared}/FullBleedContent/index.js +0 -0
  356. /package/lib/{shared → esm/shared}/FullBleedContent/useFullBleedContentProps.js +0 -0
  357. /package/lib/{shared → esm/shared}/VideoSplash/helpers.js +0 -0
  358. /package/lib/{utils → esm/utils}/isElementFocusable.js +0 -0
  359. /package/lib/{utils → esm/utils}/logger.js +0 -0
  360. /package/lib/{utils → esm/utils}/media.js +0 -0
  361. /package/lib/{utils → esm/utils}/renderStructuredContent.js +0 -0
  362. /package/lib/{utils → esm/utils}/scrollToAnchor.js +0 -0
  363. /package/lib/{utils → esm/utils}/theming/get-theme-from-server.js +0 -0
  364. /package/lib/{utils → esm/utils}/theming/with-client-theme.js +0 -0
  365. /package/lib/{utils → esm/utils}/theming/with-server-theme.js +0 -0
  366. /package/lib/{utils → esm/utils}/transforms.js +0 -0
  367. /package/lib/{utils → esm/utils}/useOverlaidPosition.js +0 -0
  368. /package/lib/{utils → esm/utils}/useTypographyTheme.js +0 -0
@@ -0,0 +1,964 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _fscreen = _interopRequireDefault(require("fscreen"));
10
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
11
+ var _componentsBase = require("@telus-uds/components-base");
12
+ var _Spinner = _interopRequireDefault(require("../Spinner"));
13
+ var _utils = require("../utils");
14
+ var _VideoSplash = _interopRequireDefault(require("../shared/VideoSplash/VideoSplash"));
15
+ var _MiddleControlButton = _interopRequireDefault(require("./MiddleControlButton/MiddleControlButton"));
16
+ var _ControlBar = _interopRequireDefault(require("./ControlBar/ControlBar"));
17
+ var _videoText = _interopRequireDefault(require("./videoText"));
18
+ var _jsxRuntime = require("react/jsx-runtime");
19
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
+ const [selectProps, selectedSystemPropTypes] = (0, _componentsBase.selectSystemProps)([_utils.htmlAttrs]);
21
+
22
+ // TODO: replace with the actual spinner component from UDS
23
+ const VideoPlayerContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
24
+ displayName: "Video__VideoPlayerContainer",
25
+ componentId: "components-web__sc-12ltnuw-0"
26
+ })(_ref => {
27
+ let {
28
+ videoBorder,
29
+ borderColor
30
+ } = _ref;
31
+ return {
32
+ width: '100%',
33
+ outline: 'none',
34
+ position: 'relative',
35
+ border: videoBorder ? `20px solid ${borderColor}` : undefined
36
+ };
37
+ });
38
+ const VideoElementContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
39
+ displayName: "Video__VideoElementContainer",
40
+ componentId: "components-web__sc-12ltnuw-1"
41
+ })({
42
+ outline: 'none',
43
+ width: '100%',
44
+ height: '100%',
45
+ fontSize: 0
46
+ });
47
+ const VideoPlayer = /*#__PURE__*/_styledComponents.default.video.withConfig({
48
+ displayName: "Video__VideoPlayer",
49
+ componentId: "components-web__sc-12ltnuw-2"
50
+ })({
51
+ width: '100%',
52
+ height: '100%'
53
+ });
54
+ const VideoOverlayContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
55
+ displayName: "Video__VideoOverlayContainer",
56
+ componentId: "components-web__sc-12ltnuw-3"
57
+ })(_ref2 => {
58
+ let {
59
+ mouseInactive
60
+ } = _ref2;
61
+ return {
62
+ width: '100%',
63
+ height: '100%',
64
+ position: 'absolute',
65
+ cursor: mouseInactive ? 'none' : 'pointer'
66
+ };
67
+ });
68
+ const VideoSplashContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
69
+ displayName: "Video__VideoSplashContainer",
70
+ componentId: "components-web__sc-12ltnuw-4"
71
+ })({
72
+ position: 'absolute',
73
+ width: '100%',
74
+ height: '100%',
75
+ zIndex: 5
76
+ });
77
+ const VideoOverlayElementContainer = /*#__PURE__*/_styledComponents.default.div.withConfig({
78
+ displayName: "Video__VideoOverlayElementContainer",
79
+ componentId: "components-web__sc-12ltnuw-5"
80
+ })({
81
+ position: 'absolute',
82
+ zIndex: 4,
83
+ display: 'flex',
84
+ justifyContent: 'center',
85
+ alignItems: 'center',
86
+ width: '100%',
87
+ height: '100%'
88
+ });
89
+ const Video = _ref3 => {
90
+ let {
91
+ analyticsTracking,
92
+ videoTitle,
93
+ videoBorder = false,
94
+ simpleMode = false,
95
+ copy,
96
+ posterSrc,
97
+ crossOrigin,
98
+ defaultVolume = 100,
99
+ beginMuted = false,
100
+ sources,
101
+ tracks,
102
+ defaultDesktopQuality = 1,
103
+ defaultMobileQuality = 1,
104
+ tokens,
105
+ variant = {},
106
+ ...rest
107
+ } = _ref3;
108
+ const refVideoPlayer = _react.default.useRef({});
109
+ const refVideoPlayerContainer = _react.default.useRef({});
110
+ const refKeyboardInstructions = _react.default.useRef({});
111
+ let inactivityTimer = null;
112
+ const {
113
+ borderColor,
114
+ pauseIcon,
115
+ playIcon,
116
+ replayIcon
117
+ } = (0, _componentsBase.useThemeTokens)('Video', tokens, variant);
118
+ const playerOptions = {
119
+ mouseTimeout: simpleMode ? 750 : 1500,
120
+ // defined in ms
121
+ keyboardSeekIncrement: 5,
122
+ // defined in s
123
+ keyboardVolumeIncrement: 0.1,
124
+ // from 0 to 1
125
+ compactModeThreshold: 700 // in px
126
+ };
127
+ const [videoPlayerState, setVideoPlayerState] = _react.default.useState({
128
+ loadedSources: null,
129
+ loadedTracks: null,
130
+ videoLength: 0,
131
+ videoCurrentTime: -1,
132
+ videoBufferEnd: 0,
133
+ videoUnplayed: true,
134
+ videoIsBuffering: false,
135
+ videoCurrentVolume: 1,
136
+ videoIsPlaying: false,
137
+ videoIsMuted: false,
138
+ videoIsFullscreen: false,
139
+ mouseInactive: false,
140
+ videoEnded: false,
141
+ videoQuality: defaultDesktopQuality,
142
+ videoQualityChanged: false,
143
+ selectedTextTrack: -1,
144
+ mouseOnControlBar: false,
145
+ qualityMenuOpen: false,
146
+ captionsMenuOpen: false,
147
+ isMobile: false,
148
+ videoPlayerWidth: 0,
149
+ percentageWatched: 'watched 0%'
150
+ });
151
+ const generateSources = videoQuality => {
152
+ return sources.map(source => {
153
+ if (source.qualityRank === videoQuality) {
154
+ return /*#__PURE__*/_react.default.createElement('source', {
155
+ src: source.source,
156
+ type: source.mediaType,
157
+ key: source.source
158
+ });
159
+ }
160
+ return undefined;
161
+ });
162
+ };
163
+ const generateTracks = () => {
164
+ return tracks.map(track => {
165
+ return /*#__PURE__*/_react.default.createElement('track', {
166
+ label: track.label,
167
+ kind: track.kind,
168
+ srcLang: track.language,
169
+ src: track.source,
170
+ default: track.isDefault,
171
+ key: track.source
172
+ });
173
+ });
174
+ };
175
+ const refreshMedia = () => {
176
+ const {
177
+ videoUnplayed
178
+ } = videoPlayerState;
179
+
180
+ // Handle mobile check
181
+ const isMobile = navigator && navigator.userAgent.indexOf('Mobi') >= 0;
182
+ if (videoUnplayed && isMobile) {
183
+ setVideoPlayerState(prevState => ({
184
+ ...prevState,
185
+ isMobile,
186
+ videoQuality: isMobile ? defaultMobileQuality : defaultDesktopQuality
187
+ }));
188
+ }
189
+
190
+ // Load media
191
+ setVideoPlayerState(prevState => ({
192
+ ...prevState,
193
+ loadedSources: generateSources(prevState.videoQuality),
194
+ loadedTracks: tracks && generateTracks()
195
+ }));
196
+ };
197
+ const percentageBucket = percentValue => {
198
+ if (percentValue < 25) {
199
+ return setVideoPlayerState(prevState => {
200
+ if (prevState !== 'watched 0%') {
201
+ return {
202
+ ...prevState,
203
+ percentageWatched: 'watched 0%'
204
+ };
205
+ }
206
+ return false;
207
+ });
208
+ }
209
+ if (percentValue < 50) {
210
+ return setVideoPlayerState(prevState => {
211
+ if (prevState !== 'watched 25%') {
212
+ return {
213
+ ...prevState,
214
+ percentageWatched: 'watched 25%'
215
+ };
216
+ }
217
+ return false;
218
+ });
219
+ }
220
+ if (percentValue < 75) {
221
+ return setVideoPlayerState(prevState => {
222
+ if (prevState !== 'watched 50%') {
223
+ return {
224
+ ...prevState,
225
+ percentageWatched: 'watched 50%'
226
+ };
227
+ }
228
+ return false;
229
+ });
230
+ }
231
+ if (percentValue < 100) {
232
+ return setVideoPlayerState(prevState => {
233
+ if (prevState !== 'watched 75%') {
234
+ return {
235
+ ...prevState,
236
+ percentageWatched: 'watched 75%'
237
+ };
238
+ }
239
+ return false;
240
+ });
241
+ }
242
+ if (percentValue === 100) {
243
+ return setVideoPlayerState(prevState => {
244
+ if (prevState !== 'watched 100%') {
245
+ return {
246
+ ...prevState,
247
+ percentageWatched: 'watched 100%'
248
+ };
249
+ }
250
+ return false;
251
+ });
252
+ }
253
+ return false;
254
+ };
255
+
256
+ // required for analytics
257
+ const calculatePercentageWatched = () => {
258
+ const {
259
+ videoCurrentTime,
260
+ videoLength,
261
+ percentageWatched
262
+ } = videoPlayerState;
263
+ let percentValue = videoCurrentTime / videoLength * 100;
264
+ percentValue = Math.round(percentValue);
265
+ const previousValue = percentageWatched;
266
+ percentageBucket(percentValue);
267
+ if (previousValue !== percentageWatched) {
268
+ const analyticsObject = {
269
+ name: 'video tracking',
270
+ details: videoTitle
271
+ };
272
+ analyticsObject.action = percentageWatched;
273
+ analyticsTracking(analyticsObject);
274
+ }
275
+ };
276
+ const setPlaying = async isPlaying => {
277
+ const videoPlayer = refVideoPlayer.current;
278
+ if (isPlaying) {
279
+ await videoPlayer.play();
280
+ if (analyticsTracking !== undefined && videoTitle) {
281
+ const intervalId = setInterval(calculatePercentageWatched, 300);
282
+ setVideoPlayerState(prevState => ({
283
+ ...prevState,
284
+ intervalId
285
+ }));
286
+ }
287
+ } else {
288
+ const {
289
+ intervalId
290
+ } = videoPlayerState;
291
+ videoPlayer.pause();
292
+ clearInterval(intervalId);
293
+ }
294
+ };
295
+ const updateAnalyticsData = () => {
296
+ const {
297
+ videoIsPlaying,
298
+ percentageWatched
299
+ } = videoPlayerState;
300
+ const analyticsObject = {
301
+ name: 'video tracking',
302
+ details: videoTitle
303
+ };
304
+ analyticsObject.action = videoIsPlaying ? 'play' : 'pause';
305
+ if (percentageWatched !== 'watched 100%') {
306
+ analyticsTracking(analyticsObject);
307
+ }
308
+ };
309
+ const setSeek = seconds => {
310
+ refVideoPlayer.current.currentTime = seconds;
311
+ };
312
+ const qualitySwitchSeek = () => {
313
+ const {
314
+ videoCurrentTime
315
+ } = videoPlayerState;
316
+
317
+ // The following setState gets the video length on the splash screen in iOS
318
+ setVideoPlayerState(prevState => ({
319
+ ...prevState,
320
+ videoLength: refVideoPlayer.current.duration
321
+ }));
322
+ if (videoCurrentTime > -1) {
323
+ setSeek(videoCurrentTime);
324
+ }
325
+ };
326
+ const updateVideoTimestamp = () => {
327
+ setVideoPlayerState(prevState => ({
328
+ ...prevState,
329
+ videoCurrentTime: refVideoPlayer.current.currentTime
330
+ }));
331
+ };
332
+ const initializeVideoDuration = () => {
333
+ // This will run on every load() call, meaning it will also run when video quality is changed.
334
+ setVideoPlayerState(prevState => {
335
+ return {
336
+ ...prevState,
337
+ videoLength: refVideoPlayer.current.duration,
338
+ videoBufferEnd: refVideoPlayer.current.buffered.length === 0 ? 0 : refVideoPlayer.current.buffered.end(refVideoPlayer.current.buffered.length - 1),
339
+ videoUnplayed: refVideoPlayer.current.played.length === 0 && !prevState.videoQualityChanged
340
+ };
341
+ });
342
+ const {
343
+ videoQualityChanged,
344
+ videoIsPlaying
345
+ } = videoPlayerState;
346
+
347
+ // Prevents an IE 11 bug where the video will not continue playing after a quality switch
348
+ if (videoQualityChanged && videoIsPlaying) {
349
+ setPlaying(true);
350
+ }
351
+ };
352
+ const clearInactivityTimer = () => {
353
+ setVideoPlayerState(prevState => ({
354
+ ...prevState,
355
+ mouseInactive: false
356
+ }));
357
+ clearTimeout(inactivityTimer);
358
+ };
359
+ const setAsBuffering = () => {
360
+ // Prevent IE infinite buffer bug with readyState
361
+ if (refVideoPlayer.current.readyState < 4) {
362
+ clearInactivityTimer();
363
+ setVideoPlayerState(prevState => ({
364
+ ...prevState,
365
+ videoIsPlaying: false,
366
+ videoIsBuffering: true,
367
+ mouseInactive: true
368
+ }));
369
+ setPlaying(false);
370
+ }
371
+ };
372
+ const playAfterBuffer = () => {
373
+ const {
374
+ videoIsBuffering,
375
+ videoCurrentTime,
376
+ videoQualityChanged
377
+ } = videoPlayerState;
378
+ if (videoIsBuffering && videoCurrentTime !== -1 && !videoQualityChanged) {
379
+ setPlaying(true);
380
+ setVideoPlayerState(prevState => ({
381
+ ...prevState,
382
+ videoIsBuffering: false
383
+ }));
384
+ }
385
+ };
386
+ const resetInactivityTimer = () => {
387
+ clearInactivityTimer();
388
+ const {
389
+ videoQualityChanged,
390
+ videoIsPlaying,
391
+ mouseOnControlBar
392
+ } = videoPlayerState;
393
+ if (!videoQualityChanged && videoIsPlaying) {
394
+ inactivityTimer = setTimeout(() => {
395
+ if (!mouseOnControlBar) {
396
+ setVideoPlayerState(prevState => ({
397
+ ...prevState,
398
+ mouseInactive: true
399
+ }));
400
+ }
401
+ }, playerOptions.mouseTimeout);
402
+ }
403
+ };
404
+ const setAsPlaying = () => {
405
+ setVideoPlayerState(prevState => ({
406
+ ...prevState,
407
+ videoIsPlaying: true,
408
+ videoIsBuffering: false,
409
+ videoEnded: false,
410
+ videoUnplayed: false,
411
+ videoQualityChanged: false
412
+ }));
413
+ if (analyticsTracking) {
414
+ updateAnalyticsData();
415
+ }
416
+ resetInactivityTimer();
417
+ };
418
+ const setAsPaused = () => {
419
+ clearInactivityTimer();
420
+ setVideoPlayerState(prevState => ({
421
+ ...prevState,
422
+ videoIsPlaying: false
423
+ }));
424
+ if (analyticsTracking) {
425
+ updateAnalyticsData();
426
+ }
427
+ };
428
+ const returnFromEndState = () => {
429
+ resetInactivityTimer();
430
+ setVideoPlayerState(prevState => ({
431
+ ...prevState,
432
+ videoEnded: false
433
+ }));
434
+ };
435
+ const setAsEnded = () => {
436
+ setVideoPlayerState(prevState => ({
437
+ ...prevState,
438
+ videoIsPlaying: false,
439
+ videoEnded: true
440
+ }));
441
+ clearInactivityTimer();
442
+ };
443
+ const updateBufferProgress = () => {
444
+ const {
445
+ videoCurrentTime,
446
+ videoQualityChanged
447
+ } = videoPlayerState;
448
+ const videoPlayer = refVideoPlayer.current;
449
+ if (videoPlayer && videoPlayer.readyState >= 2) {
450
+ const {
451
+ buffered
452
+ } = videoPlayer;
453
+ setVideoPlayerState(prevState => ({
454
+ ...prevState,
455
+ videoBufferEnd: buffered.length === 0 ? 0 : buffered.end(buffered.length - 1)
456
+ }));
457
+ } else if (videoCurrentTime !== -1 && !videoQualityChanged && !videoPlayer) {
458
+ setVideoPlayerState(prevState => ({
459
+ ...prevState,
460
+ videoIsPlaying: false,
461
+ videoIsBuffering: true
462
+ }));
463
+ }
464
+ };
465
+ const updateVolumeState = () => {
466
+ resetInactivityTimer();
467
+ const videoPlayer = refVideoPlayer.current;
468
+ setVideoPlayerState(prevState => ({
469
+ ...prevState,
470
+ videoCurrentVolume: videoPlayer.volume,
471
+ videoIsMuted: videoPlayer.muted
472
+ }));
473
+ };
474
+ const getPlayerWidth = () => {
475
+ setVideoPlayerState(prevState => ({
476
+ ...prevState,
477
+ videoPlayerWidth: refVideoPlayerContainer.current.offsetWidth
478
+ }));
479
+ };
480
+ const setMouseOnControlBar = isOver => {
481
+ setVideoPlayerState(prevState => ({
482
+ ...prevState,
483
+ mouseOnControlBar: isOver
484
+ }));
485
+ };
486
+ const togglePlayPause = () => {
487
+ const {
488
+ videoIsPlaying
489
+ } = videoPlayerState;
490
+ setPlaying(!videoIsPlaying);
491
+ };
492
+ const setTextTracks = trackNumber => {
493
+ const {
494
+ textTracks
495
+ } = refVideoPlayer.current;
496
+ for (let i = 0; i < textTracks.length; i += 1) {
497
+ textTracks[i].mode = i === trackNumber ? 'showing' : 'hidden';
498
+ }
499
+ setVideoPlayerState(prevState => ({
500
+ ...prevState,
501
+ selectedTextTrack: trackNumber
502
+ }));
503
+ };
504
+ const beginVideo = () => {
505
+ setTextTracks(-1);
506
+ setPlaying(true);
507
+ refVideoPlayerContainer.current.focus();
508
+ };
509
+ const closeSubMenus = () => {
510
+ setVideoPlayerState(prevState => ({
511
+ ...prevState,
512
+ qualityMenuOpen: false,
513
+ captionsMenuOpen: false
514
+ }));
515
+ };
516
+ const incrementSeek = seconds => {
517
+ refVideoPlayer.current.currentTime += seconds;
518
+ };
519
+ const replayVideo = async () => {
520
+ setSeek(0);
521
+ togglePlayPause();
522
+ };
523
+ const incrementVolume = amount => {
524
+ refVideoPlayer.current.volume += amount;
525
+ };
526
+ const setVolume = amount => {
527
+ refVideoPlayer.current.volume = amount;
528
+ };
529
+ const toggleMute = () => {
530
+ refVideoPlayer.current.muted = !refVideoPlayer.current.muted;
531
+ };
532
+ const setCaptionsMenuOpen = isOpen => {
533
+ setVideoPlayerState(prevState => ({
534
+ ...prevState,
535
+ captionsMenuOpen: isOpen
536
+ }));
537
+ };
538
+ const toggleFullscreen = () => {
539
+ if (_fscreen.default.fullscreenEnabled) {
540
+ if (_fscreen.default.fullscreenElement === null) {
541
+ _fscreen.default.requestFullscreen(refVideoPlayerContainer.current);
542
+ } else {
543
+ _fscreen.default.exitFullscreen();
544
+ }
545
+ setVideoPlayerState(prevState => {
546
+ return {
547
+ ...prevState,
548
+ videoIsFullscreen: !prevState.videoIsFullscreen
549
+ };
550
+ });
551
+ }
552
+ };
553
+ const setVideoQuality = async newVideoQuality => {
554
+ await setPlaying(false);
555
+ setVideoPlayerState(prevState => ({
556
+ ...prevState,
557
+ videoLength: 0,
558
+ videoBufferEnd: 0,
559
+ videoQuality: newVideoQuality,
560
+ loadedSources: generateSources(newVideoQuality),
561
+ loadedTracks: tracks && generateTracks(),
562
+ videoQualityChanged: true
563
+ }));
564
+ await refVideoPlayer.current.load();
565
+ resetInactivityTimer();
566
+ setSeek(videoPlayerState.videoCurrentTime);
567
+ };
568
+ const setQualityMenuOpen = isOpen => {
569
+ setVideoPlayerState(prevState => ({
570
+ ...prevState,
571
+ qualityMenuOpen: isOpen
572
+ }));
573
+ };
574
+ const handleClick = event => {
575
+ resetInactivityTimer();
576
+
577
+ // This allows playing videos within components that act like
578
+ // links, e.g. `PreviewCard`, `StoryCard`, etc.
579
+ event?.preventDefault();
580
+ event?.stopPropagation();
581
+ };
582
+ const handleKeyboard = event => {
583
+ const {
584
+ videoLength,
585
+ videoCurrentVolume
586
+ } = videoPlayerState;
587
+ const key = event.key || event.keyCode;
588
+
589
+ // *** Begin Seek & Play Control ****
590
+ if (key === ' ' || key === 32 || key === 'k' || key === 75) {
591
+ event.preventDefault();
592
+ resetInactivityTimer();
593
+ togglePlayPause();
594
+ }
595
+
596
+ // Disables all keys except for play/pause when in simpleMode
597
+ if (!simpleMode) {
598
+ if (key === 'ArrowRight' || key === 39 || key === '.' || key === 190) {
599
+ resetInactivityTimer();
600
+ incrementSeek(playerOptions.keyboardSeekIncrement);
601
+ }
602
+ if (key === 'ArrowLeft' || key === 37 || key === ',' || key === 188) {
603
+ resetInactivityTimer();
604
+ incrementSeek(-playerOptions.keyboardSeekIncrement);
605
+ }
606
+ if (key === '0' || key === 48 || key === 'numpad 0' || key === 96) {
607
+ setSeek(0);
608
+ }
609
+ if (key === '1' || key === 49 || key === 'numpad 1' || key === 97) {
610
+ setSeek(videoLength * 0.1);
611
+ }
612
+ if (key === '2' || key === 50 || key === 'numpad 2' || key === 98) {
613
+ setSeek(videoLength * 0.2);
614
+ }
615
+ if (key === '3' || key === 51 || key === 'numpad 3' || key === 99) {
616
+ setSeek(videoLength * 0.3);
617
+ }
618
+ if (key === '4' || key === 52 || key === 'numpad 4' || key === 100) {
619
+ setSeek(videoLength * 0.4);
620
+ }
621
+ if (key === '5' || key === 53 || key === 'numpad 5' || key === 101) {
622
+ setSeek(videoLength * 0.5);
623
+ }
624
+ if (key === '6' || key === 54 || key === 'numpad 6' || key === 102) {
625
+ setSeek(videoLength * 0.6);
626
+ }
627
+ if (key === '7' || key === 55 || key === 'numpad 7' || key === 103) {
628
+ setSeek(videoLength * 0.7);
629
+ }
630
+ if (key === '8' || key === 56 || key === 'numpad 8' || key === 104) {
631
+ setSeek(videoLength * 0.8);
632
+ }
633
+ if (key === '9' || key === 57 || key === 'numpad 9' || key === 105) {
634
+ setSeek(videoLength * 0.9);
635
+ }
636
+
637
+ // **** End Seek & Play Control ****
638
+
639
+ // **** Begin Volume Control ****
640
+
641
+ const {
642
+ keyboardVolumeIncrement
643
+ } = playerOptions;
644
+ if (key === 'ArrowUp' || key === 38 || key === '=' || key === 187 || key === 'add' || key === 107) {
645
+ resetInactivityTimer();
646
+ if (videoCurrentVolume + keyboardVolumeIncrement < 1) {
647
+ incrementVolume(keyboardVolumeIncrement);
648
+ } else {
649
+ setVolume(1);
650
+ }
651
+ }
652
+ if (key === 'ArrowDown' || key === 40 || key === '-' || key === 189 || key === 'subtract' || key === 109) {
653
+ resetInactivityTimer();
654
+ if (videoCurrentVolume - keyboardVolumeIncrement > 0) {
655
+ incrementVolume(-keyboardVolumeIncrement);
656
+ } else {
657
+ setVolume(0);
658
+ }
659
+ }
660
+ if (key === 'm' || key === 77) {
661
+ resetInactivityTimer();
662
+ toggleMute();
663
+ }
664
+ if (key === 'f' || key === 70) {
665
+ resetInactivityTimer();
666
+ toggleFullscreen();
667
+ }
668
+ if (key === 'Escape' || key === 27) {
669
+ // Resets focus back to container if user is focused on ControlBar button
670
+ refVideoPlayerContainer.current.focus();
671
+ closeSubMenus();
672
+ }
673
+ if (key === 'q' || key === 81) {
674
+ refKeyboardInstructions.current.focus();
675
+ }
676
+ }
677
+ };
678
+
679
+ // Prepares video and caption files
680
+ _react.default.useEffect(() => {
681
+ refreshMedia();
682
+ // eslint-disable-next-line react-hooks/exhaustive-deps
683
+ }, []);
684
+
685
+ // Initial Setup after loading sources
686
+ _react.default.useEffect(() => {
687
+ const {
688
+ loadedSources,
689
+ loadedTracks
690
+ } = videoPlayerState;
691
+ if (loadedSources && loadedTracks) {
692
+ const videoPlayer = refVideoPlayer.current;
693
+
694
+ // Initializes Settings
695
+ videoPlayer.volume = defaultVolume / 100;
696
+ videoPlayer.muted = beginMuted || simpleMode;
697
+ getPlayerWidth();
698
+
699
+ // Reports when the video has completed loading metadata (used for seeking after quality switch)
700
+ videoPlayer.onloadedmetadata = qualitySwitchSeek;
701
+
702
+ // Reports the video's duration when the video player is ready to play
703
+ videoPlayer.oncanplay = initializeVideoDuration;
704
+
705
+ // Reports the video's width on resize
706
+ window.addEventListener('resize', getPlayerWidth);
707
+
708
+ // Reports the current video timestamp
709
+ videoPlayer.ontimeupdate = updateVideoTimestamp;
710
+
711
+ // Reports when the video has paused due to buffering
712
+ videoPlayer.onwaiting = setAsBuffering;
713
+
714
+ // Reports the video's latest buffering progress if video player is properly initialized
715
+ videoPlayer.onprogress = updateBufferProgress;
716
+
717
+ // Reports when the video has recovered from buffering
718
+ videoPlayer.oncanplaythrough = playAfterBuffer;
719
+
720
+ // Reports when the video has ended
721
+ videoPlayer.onended = setAsEnded;
722
+
723
+ // Reports when the video is playing and disables the buffer spinner (even if buffering is still needed)
724
+ videoPlayer.onplay = setAsPlaying;
725
+
726
+ // Reports when the video has been paused
727
+ videoPlayer.onpause = setAsPaused;
728
+
729
+ // Reports when the video has been seeked
730
+ videoPlayer.onseeked = returnFromEndState;
731
+
732
+ // Reports when the video's volume has been changed, or if the video has been muted
733
+ videoPlayer.onvolumechange = updateVolumeState;
734
+
735
+ // Video Analytics
736
+ if (analyticsTracking !== undefined && videoTitle === undefined || analyticsTracking === undefined && videoTitle !== undefined) {
737
+ (0, _utils.warn)('Video', 'Both the `analyticsTracking` and `videoTitle` props must be defined in order to return a proper analytics object.');
738
+ }
739
+ return () => {
740
+ clearInactivityTimer();
741
+ window.removeEventListener('resize', getPlayerWidth);
742
+ clearInterval(videoPlayerState.intervalId);
743
+ };
744
+ }
745
+ return () => {}; // returning a noop for sake of consistency
746
+ // eslint-disable-next-line react-hooks/exhaustive-deps
747
+ }, [videoPlayerState.loadedSources, videoPlayerState.loadedTracks]);
748
+ const {
749
+ loadedSources,
750
+ loadedTracks,
751
+ isMobile,
752
+ mouseInactive,
753
+ selectedTextTrack,
754
+ qualityMenuOpen,
755
+ captionsMenuOpen,
756
+ videoUnplayed,
757
+ videoEnded,
758
+ videoIsBuffering,
759
+ videoIsPlaying,
760
+ videoIsFullscreen,
761
+ videoIsMuted,
762
+ videoQualityChanged,
763
+ videoLength,
764
+ videoBufferEnd,
765
+ videoCurrentTime,
766
+ videoCurrentVolume,
767
+ videoQuality,
768
+ videoPlayerWidth
769
+ } = videoPlayerState;
770
+ const {
771
+ style,
772
+ className,
773
+ as,
774
+ ...safeRest
775
+ } = rest;
776
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(VideoPlayerContainer, {
777
+ ...safeRest,
778
+ ref: refVideoPlayerContainer,
779
+ videoBorder: videoBorder,
780
+ borderColor: borderColor,
781
+ onMouseMove: resetInactivityTimer,
782
+ onClick: handleClick,
783
+ onKeyDown: handleKeyboard,
784
+ tabIndex: "0",
785
+ "aria-label": simpleMode ? _videoText.default[copy].videoSelectedSimple : _videoText.default[copy].videoSelected,
786
+ "data-testid": "videoPlayer",
787
+ ...selectProps(rest),
788
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(VideoOverlayContainer, {
789
+ mouseInactive: mouseInactive,
790
+ onClick: () => {
791
+ closeSubMenus();
792
+ togglePlayPause();
793
+ },
794
+ children: [videoUnplayed && !videoQualityChanged && /*#__PURE__*/(0, _jsxRuntime.jsx)(VideoSplashContainer, {
795
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VideoSplash.default, {
796
+ poster: posterSrc,
797
+ copy: copy,
798
+ videoLength: videoLength,
799
+ simpleMode: simpleMode,
800
+ iconLeftOffsetPx: 2,
801
+ onClick: beginVideo
802
+ })
803
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(VideoOverlayElementContainer, {
804
+ children: [videoEnded && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MiddleControlButton.default, {
805
+ icon: replayIcon,
806
+ onClick: replayVideo
807
+ }), !videoUnplayed && !videoIsBuffering && !videoEnded && !isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MiddleControlButton.default, {
808
+ icon: videoIsPlaying ? pauseIcon : playIcon,
809
+ isHidden: mouseInactive,
810
+ onClick: togglePlayPause,
811
+ onFocus: resetInactivityTimer
812
+ }), videoIsBuffering && !isMobile && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.default, {
813
+ show: true
814
+ })]
815
+ })]
816
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(VideoElementContainer, {
817
+ videoIsFullscreen: videoIsFullscreen,
818
+ mouseInactive: mouseInactive,
819
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(VideoPlayer, {
820
+ ref: refVideoPlayer,
821
+ controls: isMobile,
822
+ videoIsFullscreen: videoIsFullscreen,
823
+ crossOrigin: crossOrigin,
824
+ playsinline: true,
825
+ children: [loadedSources, loadedTracks, "Your browser does not support the video tag."]
826
+ })
827
+ }), !simpleMode && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ControlBar.default, {
828
+ videoPlayer: refVideoPlayer,
829
+ videoPlayerContainer: refVideoPlayerContainer,
830
+ sources: sources,
831
+ tracks: tracks,
832
+ videoLength: videoLength,
833
+ videoBufferEnd: videoBufferEnd,
834
+ videoCurrentTime: videoCurrentTime,
835
+ videoPlaying: refVideoPlayer.current !== null ? !refVideoPlayer.current.paused : false,
836
+ videoUnplayed: videoUnplayed,
837
+ videoCurrentVolume: videoCurrentVolume,
838
+ videoIsMuted: videoIsMuted,
839
+ setVolume: setVolume,
840
+ isHidden: (mouseInactive || videoUnplayed) && !videoEnded,
841
+ isMobile: isMobile,
842
+ tracksAvailable: tracks !== undefined,
843
+ togglePlayPause: togglePlayPause,
844
+ setSeek: setSeek,
845
+ toggleMute: toggleMute,
846
+ toggleFullscreen: toggleFullscreen,
847
+ videoIsFullscreen: videoIsFullscreen,
848
+ setTextTracks: setTextTracks,
849
+ selectedTextTrack: selectedTextTrack,
850
+ resetInactivityTimer: resetInactivityTimer,
851
+ videoQuality: videoQuality,
852
+ setVideoQuality: setVideoQuality,
853
+ qualityMenuOpen: qualityMenuOpen,
854
+ setQualityMenuOpen: setQualityMenuOpen,
855
+ captionsMenuOpen: captionsMenuOpen,
856
+ setCaptionsMenuOpen: setCaptionsMenuOpen,
857
+ clearInactivityTimer: clearInactivityTimer,
858
+ copy: copy,
859
+ compactModeThreshold: playerOptions.compactModeThreshold,
860
+ videoPlayerWidth: videoPlayerWidth,
861
+ onMouseOver: () => setMouseOnControlBar(true),
862
+ onMouseOut: () => setMouseOnControlBar(false),
863
+ onFocus: () => {},
864
+ onBlur: () => {}
865
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
866
+ tabIndex: "-1",
867
+ ref: refKeyboardInstructions,
868
+ "aria-label": _videoText.default[copy].videoPlayer,
869
+ role: "note"
870
+ })]
871
+ });
872
+ };
873
+ Video.propTypes = {
874
+ ...selectedSystemPropTypes,
875
+ /**
876
+ * An array of objects that defines each video file. See the "Basic Usage" section for more information.
877
+ */
878
+ sources: _propTypes.default.arrayOf(_propTypes.default.shape({
879
+ /** A path to a video file */
880
+ source: _propTypes.default.string.isRequired,
881
+ /** The video's MIME type (example: `video/mp4`) */
882
+ mediaType: _propTypes.default.string.isRequired,
883
+ /** The label to be given to this file in the quality selector (example: `1080p`) */
884
+ qualityName: _propTypes.default.string.isRequired,
885
+ /** A number indicating the video's quality, with 1 being the best, and the number increasing from there as quality degrades */
886
+ qualityRank: _propTypes.default.number.isRequired,
887
+ /** A boolean that defines its source as a fallback for another source with the same `qualityRank` */
888
+ isFallback: _propTypes.default.bool
889
+ })).isRequired,
890
+ /**
891
+ * A path of the image that will be displayed on the video's splash screen.
892
+ */
893
+ posterSrc: _propTypes.default.string.isRequired,
894
+ /**
895
+ * An array of objects that defines each caption file. See the "Basic Usage" section for more information.
896
+ */
897
+ tracks: _propTypes.default.arrayOf(_propTypes.default.shape({
898
+ /** A path to the track file */
899
+ source: _propTypes.default.string.isRequired,
900
+ /** The name of the track file as it will appear in the "Captions" dialogue */
901
+ label: _propTypes.default.string.isRequired,
902
+ /** The track's file type, typically one of "subtitles", "captions", or "descriptions". See [MDN's documentation](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/track#Attributes) for more information on these types */
903
+ kind: _propTypes.default.string.isRequired,
904
+ /** The language of the track file represented as a ISO 639-1 language code */
905
+ language: _propTypes.default.string.isRequired
906
+ })),
907
+ /**
908
+ * The video's default volume, defined from 1 to 100. Please use the `beginMuted` prop to have the video start silenced.
909
+ */
910
+ defaultVolume: _propTypes.default.number,
911
+ /**
912
+ * Defines if the video should start muted.
913
+ */
914
+ beginMuted: _propTypes.default.bool,
915
+ /**
916
+ * The default quality level if the user is on mobile. See the `sources` prop for available quality levels.
917
+ */
918
+ defaultMobileQuality: _propTypes.default.number,
919
+ /**
920
+ * The default quality level if the user is on desktop. See the `sources` prop for available quality levels.
921
+ */
922
+ defaultDesktopQuality: _propTypes.default.number,
923
+ /**
924
+ * The video player UI's language as an ISO language code. It currently supports English and French.
925
+ */
926
+ copy: _propTypes.default.oneOf(['en', 'fr']).isRequired,
927
+ /**
928
+ * Sets the `video` tag's `crossorigin` mode. Please note that content loaded without CORS approval may be insecure.
929
+ * @since 1.1.0
930
+ */
931
+ crossOrigin: _propTypes.default.oneOf(['anonymous', 'use-credentials']),
932
+ /**
933
+ * Disables the control bar during playback and reduces the amount of time until the UI hides itself.
934
+ * For special approved internal uses only.
935
+ * @since 1.2.0
936
+ */
937
+ simpleMode: _propTypes.default.bool,
938
+ /**
939
+ * Renders a gainsboro coloured border around the video. Used to seperate the video from the rest of the page if the video's background is the same colour as the container's.
940
+ * @since 1.2.0
941
+ */
942
+ videoBorder: _propTypes.default.bool,
943
+ /**
944
+ * A callback function that fires when a customer interacts with Video.
945
+ * When using `analyticsTracking`, `videoTitle` must also be defined.
946
+ *
947
+ * When invoked, your callback function returns an object containing three keys (see below).
948
+ * @since 1.3.0
949
+ *
950
+ * @param {Object} analyticsObject Contains video data based on customer interactions
951
+ * @param {string} analyticsObject.name Always 'video tracking'
952
+ * @param {string} analyticsObject.action Contains the latest customer action
953
+ * @param {string} analyticsObject.details The name of the video based on the `videoTitle` prop
954
+ */
955
+ analyticsTracking: _propTypes.default.func,
956
+ /**
957
+ * The title of the video being rendered. This is used for analytics purposes in conjunction with `analyticsTracking`.
958
+ * @since 1.3.0
959
+ */
960
+ videoTitle: _propTypes.default.string,
961
+ tokens: (0, _componentsBase.getTokensPropType)('Video'),
962
+ variant: _componentsBase.variantProp.propType
963
+ };
964
+ var _default = exports.default = Video;