@clickview/reports 0.85.0-rc.1 → 0.85.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.
- package/dist/.vite/manifest.json +254 -254
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{Udxe63DQ.chunk.js → 1QInraEU.chunk.js} +2 -2
- package/dist/scripts/{Udxe63DQ.chunk.js.map → 1QInraEU.chunk.js.map} +1 -1
- package/dist/scripts/{1pdbKMyH.chunk.js → BKiOvaYB.chunk.js} +2 -2
- package/dist/scripts/{1pdbKMyH.chunk.js.map → BKiOvaYB.chunk.js.map} +1 -1
- package/dist/scripts/{3q7nyVif2.chunk.js → BLOn55yc2.chunk.js} +2 -2
- package/dist/scripts/{3q7nyVif2.chunk.js.map → BLOn55yc2.chunk.js.map} +1 -1
- package/dist/scripts/{c7dUmf3R.chunk.js → BQRq3wMq.chunk.js} +2 -2
- package/dist/scripts/{c7dUmf3R.chunk.js.map → BQRq3wMq.chunk.js.map} +1 -1
- package/dist/scripts/{ktNy7dHM2.chunk.js → BVYWFaVq2.chunk.js} +2 -2
- package/dist/scripts/{ktNy7dHM2.chunk.js.map → BVYWFaVq2.chunk.js.map} +1 -1
- package/dist/scripts/{Bua2prVk2.chunk.js → BYg4x7Hk2.chunk.js} +2 -2
- package/dist/scripts/{Bua2prVk2.chunk.js.map → BYg4x7Hk2.chunk.js.map} +1 -1
- package/dist/scripts/{BpzXy-5d.chunk.js → CCJmvNz9.chunk.js} +2 -2
- package/dist/scripts/{BpzXy-5d.chunk.js.map → CCJmvNz9.chunk.js.map} +1 -1
- package/dist/scripts/{B9S_LeFP.chunk.js → CJ_C4cSo.chunk.js} +2 -2
- package/dist/scripts/{B9S_LeFP.chunk.js.map → CJ_C4cSo.chunk.js.map} +1 -1
- package/dist/scripts/{2MxiB_er.chunk.js → CJrWNjmQ.chunk.js} +2 -2
- package/dist/scripts/{2MxiB_er.chunk.js.map → CJrWNjmQ.chunk.js.map} +1 -1
- package/dist/scripts/{BfhdSOSX2.chunk.js → CLJ99uF52.chunk.js} +2 -2
- package/dist/scripts/{BfhdSOSX2.chunk.js.map → CLJ99uF52.chunk.js.map} +1 -1
- package/dist/scripts/{Bx5qk-PZ.chunk.js → CrWahilx.chunk.js} +3 -3
- package/dist/scripts/{Bx5qk-PZ.chunk.js.map → CrWahilx.chunk.js.map} +1 -1
- package/dist/scripts/{3EzrYsbw2.chunk.js → CweBHuQE2.chunk.js} +2 -2
- package/dist/scripts/{3EzrYsbw2.chunk.js.map → CweBHuQE2.chunk.js.map} +1 -1
- package/dist/scripts/{CJIwkABI.chunk.js → D1qCdqwU.chunk.js} +2 -2
- package/dist/scripts/{CJIwkABI.chunk.js.map → D1qCdqwU.chunk.js.map} +1 -1
- package/dist/scripts/{DTy5e0Yv2.chunk.js → DLVy0r752.chunk.js} +2 -2
- package/dist/scripts/{DTy5e0Yv2.chunk.js.map → DLVy0r752.chunk.js.map} +1 -1
- package/dist/scripts/{n2iCrpxU.chunk.js → DPOQnXtj.chunk.js} +2 -2
- package/dist/scripts/{n2iCrpxU.chunk.js.map → DPOQnXtj.chunk.js.map} +1 -1
- package/dist/scripts/{DMI-Lxl02.chunk.js → DUl1SIxT2.chunk.js} +2 -2
- package/dist/scripts/{DMI-Lxl02.chunk.js.map → DUl1SIxT2.chunk.js.map} +1 -1
- package/dist/scripts/{r-dVoZ7W2.chunk.js → DX0X_jLv2.chunk.js} +2 -2
- package/dist/scripts/{r-dVoZ7W2.chunk.js.map → DX0X_jLv2.chunk.js.map} +1 -1
- package/dist/scripts/{CCLDpjnt2.chunk.js → DhuQHM9r2.chunk.js} +2 -2
- package/dist/scripts/{CCLDpjnt2.chunk.js.map → DhuQHM9r2.chunk.js.map} +1 -1
- package/dist/scripts/{CKVaLGJC.chunk.js → DuhdxQvW.chunk.js} +2 -2
- package/dist/scripts/{CKVaLGJC.chunk.js.map → DuhdxQvW.chunk.js.map} +1 -1
- package/dist/scripts/{BvNaANAO2.chunk.js → Dxn4eKcF2.chunk.js} +2 -2
- package/dist/scripts/{BvNaANAO2.chunk.js.map → Dxn4eKcF2.chunk.js.map} +1 -1
- package/dist/scripts/{BKW2JeVr.chunk.js → DzrBVuW7.chunk.js} +2 -2
- package/dist/scripts/{BKW2JeVr.chunk.js.map → DzrBVuW7.chunk.js.map} +1 -1
- package/dist/scripts/{CMKPCLR42.chunk.js → GphIKxTp2.chunk.js} +2 -2
- package/dist/scripts/{CMKPCLR42.chunk.js.map → GphIKxTp2.chunk.js.map} +1 -1
- package/dist/scripts/{CqCz1X85.chunk.js → J1C7-I-X.chunk.js} +2 -2
- package/dist/scripts/{CqCz1X85.chunk.js.map → J1C7-I-X.chunk.js.map} +1 -1
- package/dist/scripts/{BnfA2fln.chunk.js → Jx7lSD0p.chunk.js} +2 -2
- package/dist/scripts/{BnfA2fln.chunk.js.map → Jx7lSD0p.chunk.js.map} +1 -1
- package/dist/scripts/LEHDmMO5.chunk.js +1 -0
- package/dist/scripts/{Cpm-LpwK.chunk.js → VmHmm_9S.chunk.js} +2 -2
- package/dist/scripts/{Cpm-LpwK.chunk.js.map → VmHmm_9S.chunk.js.map} +1 -1
- package/dist/scripts/{app-BigOHyYp.js → app-CYtIuHZu.js} +4 -4
- package/dist/scripts/app-CYtIuHZu.js.map +1 -0
- package/dist/scripts/{DgPadkLi2.chunk.js → d-7NhDV82.chunk.js} +2 -2
- package/dist/scripts/{DgPadkLi2.chunk.js.map → d-7NhDV82.chunk.js.map} +1 -1
- package/dist/scripts/{ClOZ7MLV.chunk.js → jid_wNb7.chunk.js} +2 -2
- package/dist/scripts/{ClOZ7MLV.chunk.js.map → jid_wNb7.chunk.js.map} +1 -1
- package/dist/scripts/moDT6wFa.chunk.js +1 -0
- package/dist/scripts/{CKRKdk5U.chunk.js → qK0CbwPW.chunk.js} +2 -2
- package/dist/scripts/{CKRKdk5U.chunk.js.map → qK0CbwPW.chunk.js.map} +1 -1
- package/dist/scripts/{CowZxgkl2.chunk.js → voEp8KSU2.chunk.js} +2 -2
- package/dist/scripts/{CowZxgkl2.chunk.js.map → voEp8KSU2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/Bs1YLdQb.chunk.js +0 -1
- package/dist/scripts/Cah5ISd-.chunk.js +0 -1
- package/dist/scripts/app-BigOHyYp.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"3q7nyVif2.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/title-sub-text/title-sub-text.module.scss","../../../../libs/shared/src/components/title-sub-text/TitleSubText.tsx","../../../../libs/shared/src/images/svg/objects/HeartOutlineSvg.tsx","../../../../libs/shared/src/images/svg/objects/HeartSvg.tsx","../../../../libs/shared/src/utils/FavouriteHelpers.ts","../../../../libs/shared/src/components/favourite-button/favourite-button.module.scss","../../../../libs/shared/src/components/favourite-button/FavouriteButton.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/videos/VideoWatchProgressBar.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/video-thumbnail-bottom-bar.module.scss","../../../../libs/shared/src/components/thumbnails/bottom-bar/VideoThumbnailBottomBar.tsx","../../../../libs/shared/src/components/svg-container/SvgContainer2.tsx","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/lite-owner-avatar.module.scss","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar.tsx","../../../../libs/shared/src/components/thumbnails/plugin-hover/plugin-hover.module.scss","../../../../libs/shared/src/components/thumbnails/plugin-hover/PluginHover.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/thumbnail-padlock.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-company/thumbnail-company-logo.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo.tsx","../../../../libs/shared/src/utils/NumberHelper.ts","../../../../libs/shared/src/utils/SeriesHelper.ts","../../../../libs/shared/src/components/video-sub-text/video-sub-text.module.scss","../../../../libs/shared/src/components/video-sub-text/VideoSubText.tsx","../../../../libs/shared/src/images/svg/objects/ClipSvg.tsx","../../../../libs/shared/src/images/svg/objects/InteractiveSvg.tsx","../../../../libs/shared/src/images/svg/objects/ResourcesSvg.tsx","../../../../libs/shared/src/components/type-badge/type-badge.module.scss","../../../../libs/shared/src/components/type-badge/TypeBadge.tsx","../../../../libs/shared/src/components/video-type-badge/VideoTypeBadge.tsx","../../../../libs/shared/src/context/player-context/components/global-player-consumer.module.scss","../../../../libs/shared/src/context/player-context/components/GlobalPlayerConsumer.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/thumbnails/video/expandable/expandable-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/expandable/ExpandableVideoThumbnail.tsx","../../../../libs/shared/src/context/VideoPreviewContext.tsx","../../../../libs/shared/src/hooks/UseHoverLogger.ts","../../../../libs/shared/src/components/hover-to-portal-container/hoverToPortalContainerUtil.ts","../../../../libs/shared/src/components/hover-to-portal-container/hover-to-portal-container.module.scss","../../../../libs/shared/src/components/hover-to-portal-container/HoverToPortalContainer.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/video-thumbnail-badges.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/VideoThumbnailBadges.tsx","../../../../libs/shared/src/components/video-list/components/restriction-padlock/RestrictionPadlock.tsx","../../../../libs/shared/src/components/video-title/video-title.module.scss","../../../../libs/shared/src/components/video-title/VideoTitle.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-text/thumbnail-text.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-text/ThumbnailText.tsx","../../../../libs/shared/src/components/video-guidance/tag/video-guidance-tag.module.scss","../../../../libs/shared/src/components/video-guidance/tag/VideoGuidanceTag.tsx","../../../../libs/shared/src/images/svg/objects/GraduationCapSvg.tsx","../../../../libs/shared/src/components/video-guidance/classroom-guide/ClassroomGuideTag.tsx","../../../../libs/shared/src/components/video-guidance/interactives/InteractivesTag.tsx","../../../../libs/shared/src/components/video-guidance/resources/ResourcesTag.tsx","../../../../libs/shared/src/components/video-list/components/video-guidance/VideoItemGuidance.tsx","../../../../libs/shared/src/components/thumbnails/remove-button/remove-video-button.module.scss","../../../../libs/shared/src/components/thumbnails/remove-button/RemoveVideoButton.tsx","../../../../libs/shared/src/components/thumbnails/video/popout/popout-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/popout/PopoutVideoThumbnail.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleFilledSvg.tsx","../../../../libs/shared/src/components/mask/mask.module.scss","../../../../libs/shared/src/components/mask/Mask.tsx","../../../../libs/shared/src/images/svg/status/TickSvg.tsx","../../../../libs/shared/src/components/check-mark-button/check-mark-button.module.scss","../../../../libs/shared/src/components/check-mark-button/CheckMarkButton.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/video-thumbnail-actions.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/VideoThumbnailActions.tsx","../../../../libs/shared/src/enums/ThumbnailTextPosition.ts","../../../../libs/shared/src/components/thumbnails/video/static/static-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/static/StaticVideoThumbnail.tsx","../../../../libs/shared/src/components/thumbnails/video/VideoThumbnail.tsx"],"sourcesContent":[":local {\n .subText {\n font-size: calc(11 / 14) * 1em;\n \n &.sm {\n font-size: calc(8 / 14) * 1em;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from '../app-link/AppLink';\n\nimport styles from './title-sub-text.module.scss';\n\ntype TitleSubTextProps = React.PropsWithChildren<{\n title?: string,\n className?: string,\n ariaLabel?: string,\n appLink?: Core.AppLink,\n analyticsData?: HashObject,\n analyticsOptions?: AnalyticsOptions\n}>;\n\nexport function TitleSubText(props: TitleSubTextProps): JSX.Element {\n const className = `text-uppercase text-truncate mb-0 ${styles.subText} ${props.className}`;\n\n if (props.appLink) {\n return (\n <AppLink\n className={className}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n title={props.title}\n ariaLabel={props.ariaLabel}\n >\n {props.children}\n </AppLink>\n );\n }\n\n return (\n <div\n className={className}\n title={props.title}\n aria-label={props.ariaLabel}\n >\n {props.children}\n </div>\n );\n}\n","import React from 'react';\n\nexport function HeartOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805m.812-10.7.001-.004.007-.022.03-.097a5.83 5.83 0 0 1 .744-1.463c.565-.798 1.428-1.532 2.72-1.532 2.03 0 3.516 1.72 3.516 3.866 0 1.445-.713 2.686-2.089 4.119-.944.984-2.151 2.01-3.579 3.224-.575.49-1.187 1.01-1.832 1.57-.645-.56-1.257-1.08-1.832-1.57-1.428-1.214-2.635-2.24-3.58-3.224C5.214 12.11 4.5 10.869 4.5 9.423c0-2.146 1.487-3.865 3.517-3.865 1.29 0 2.154.734 2.719 1.532a5.8 5.8 0 0 1 .774 1.56l.007.022v.004a.5.5 0 0 0 .965 0'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function HeartSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillOpacity={0.9}\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805'\n />\n </svg>\n );\n}\n","import { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CurrentUser, User, Video, VideoTypes } from 'libs/shared/interfaces';\n\nimport { VideoHelper } from './VideoHelper';\n\nexport const FavouriteHelper = {\n\n /**\n * This helper is based on a *critical* assumption that the with statement\n * retrieving the favouritedBy collection uses a filter for the current user's id.\n * \n * The reason we're not passing the current user as an arg is that we would need to \n * drill the user object all the way down to low level componenets.\n * \n * @param object \n */\n isFavouritedByCurrentUser(object: HashObject): boolean {\n return !!(object?.favouritedBy?.data.length === 1);\n },\n\n /**\n * Determine whether the user has favourited the object\n * \n * @param object \n */\n isFavouritedByUser(object: HashObject, user: User): boolean {\n return !!(ArrayHelper.findWhere(object?.favouritedBy?.data, { id: user?.id }));\n },\n\n updateVideoState(video: VideoTypes, user: CurrentUser | User, shouldFavourite: boolean): VideoTypes {\n return {\n id: video.id,\n favouritedBy: {\n data: shouldFavourite ? [{ id: user.id } as User] : [],\n pagination: { limit: 25, cursors: { next: '', previous: '' } }\n }\n };\n },\n\n showFavouriteButton(video: Video, isHovering: boolean): boolean {\n if (!VideoHelper.getCanBeConsumed(video)?.canConsume)\n return false;\n\n if (isHovering)\n return true;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n if (FavouriteHelper.isFavouritedByCurrentUser(video))\n return true;\n\n return false;\n }\n};\n",":local {\n $badge-size: 1.875rem;\n\n %badges-size {\n width: $badge-size;\n height: $badge-size;\n }\n\n // This structure of this styling exactly matches favourite-button.scss from the favourite-plugin in player\n // When changing this please also change that - Sha\n .heart {\n display: none;\n }\n\n .favouriteButton {\n color: $dark;\n background-color: rgba($gray-200, 0.8);\n border-radius: 50%;\n @extend %badges-size;\n\n &:hover {\n color: $danger;\n\n .heartOutline {\n display: none;\n }\n\n .heart {\n opacity: 0.8;\n display: inline-block;\n }\n }\n }\n\n .favourited {\n color: $danger;\n background-color: rgba($gray-200, 0.8);\n @extend %badges-size;\n\n .heartOutline {\n display: none;\n }\n\n .heart {\n display: inline-block;\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { HeartOutlineSvg } from 'libs/shared/images/svg/objects/HeartOutlineSvg';\nimport { HeartSvg } from 'libs/shared/images/svg/objects/HeartSvg';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './favourite-button.module.scss';\n\nconst namespace = 'shared.favouriteButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouriteButtonProps {\n video: VideoTypes;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n preventFocus?: boolean;\n}\n\nexport function FavouriteButton(props: FavouriteButtonProps): JSX.Element {\n const alerts = useAlerts();\n\n const initialState = FavouriteHelper.isFavouritedByCurrentUser(props.video);\n\n // Use local state so that changes are reflected immediately.\n const [ isFavourite, setIsFavourite ] = React.useState(initialState);\n\n React.useEffect(() => {\n setIsFavourite(initialState);\n }, [initialState]);\n\n const flexClasses = 'd-flex align-items-center justify-content-center';\n let className = `${flexClasses} cursor-pointer ${styles.favouriteButton} ${isFavourite ? styles.favourited : ''}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n function onClick(): void {\n const shouldFavourite = !isFavourite;\n\n function onError(): void {\n function getErrorPhraseKey(): string {\n if (VideoHelper.isClip(props.video))\n return shouldFavourite ? 'favouriteClipError' : 'unfavouriteClipError';\n\n if (VideoHelper.isInteractive(props.video))\n return shouldFavourite ? 'favouriteInteractiveError' : 'unfavouriteInteractiveError';\n\n return shouldFavourite ? 'favouriteVideoError' : 'unfavouriteVideoError';\n }\n\n alerts.error(getPhrase(getErrorPhraseKey()));\n setIsFavourite(!shouldFavourite);\n }\n\n setIsFavourite(shouldFavourite);\n props.setFavourite(props.video, shouldFavourite, null, onError, props.analyticsData, props.analyticsOptions);\n }\n\n if (!FunctionHelper.isFunction(props.setFavourite) || !FunctionHelper.isFunction(props.canFavourite))\n return <></>;\n\n // Don't render until we know the state of isFavourite\n if (!props.canFavourite(props.video))\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} tabIndex={props.preventFocus ? -1 : undefined}>\n {/* We have the two svgs because they get swapped out on hover by the styles */}\n <SvgContainer\n svg={HeartSvg}\n className={`svg-container ${styles.heart}`}\n />\n <SvgContainer\n svg={HeartOutlineSvg}\n className={`svg-container ${styles.heartOutline}`}\n />\n </DivButton>\n );\n}\n","import * as React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoWatchProgressBarProps {\n video: Video;\n}\n\nexport function VideoWatchProgressBar(props: VideoWatchProgressBarProps): JSX.Element {\n const progress = VideoHelper.getVideoProgress(props.video);\n\n const watchPercentage = progress && props.video.duration\n && progress / props.video.duration * 100000;\n\n if (!watchPercentage)\n return <></>;\n\n return <div className='bg-primary h-100' style={{ width: `${watchPercentage}%` }} />;\n}\n",":local {\n .bottomBar {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2;\n height: $cv-video-bottom-bar-height;\n }\n}","import React from 'react';\n\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoWatchProgressBar } from './videos/VideoWatchProgressBar';\n\nimport styles from './video-thumbnail-bottom-bar.module.scss';\n\ninterface VideoThumbnailBottomBarProps {\n video: VideoTypes;\n}\n\nexport function VideoThumbnailBottomBar(props: VideoThumbnailBottomBarProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video)) {\n return <></>;\n }\n\n return (\n <div className={styles.bottomBar}>\n <VideoWatchProgressBar video={props.video} />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { SvgContainerSize } from './SvgContainer'; // TODO: Move this enum in here\n\nconst DEFAULT_CLASS_NAME = 'd-inline-block svg-container';\nconst DEFAULT_TAG_NAME = 'span';\n\ninterface SvgContainerProps2 {\n size?: SvgContainerSize;\n className?: string;\n tagName?: React.ElementType;\n onClick?: (...args: any[]) => void;\n title?: string;\n tooltipPlacement?: Placement;\n}\n\n/**\n * @deprecated please use SvgContainer instead. This component will be removed in the future\n * whenever someone gets around to it (that could be you!)\n */\nexport function SvgContainer2(props: React.PropsWithChildren<SvgContainerProps2>): React.ReactElement {\n const {\n children,\n className = DEFAULT_CLASS_NAME,\n tagName = DEFAULT_TAG_NAME,\n size = SvgContainerSize.Standard,\n onClick,\n title,\n tooltipPlacement = 'right'\n } = props;\n\n const Container = tagName;\n\n const containerProps = {\n className: `${className} svg-container ${size}`,\n onClick: FunctionHelper.isFunction(onClick) ? onClick : null\n };\n\n if (!title)\n return <Container {...containerProps}>{children}</Container>;\n\n return (\n <Tooltip title={title} placement={tooltipPlacement}>\n <Container {...containerProps}>\n {children}\n </Container>\n </Tooltip>\n );\n}\n",":local {\n $avatar-size: 1.875rem;\n $avatar-size-sm: 1.5rem;\n\n .std {\n min-width: $avatar-size;\n height: $avatar-size;\n }\n \n .sm {\n min-width: $avatar-size-sm;\n width: $avatar-size-sm;\n height: $avatar-size-sm;\n }\n\n .stdIcon {\n transform: translate(-50%, -50%);\n // ClickView logo looks better when positioned slightly further to the right\n left: 60%;\n top: 50%;\n position: absolute;\n width: 1.1rem;\n height: 1.1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .smIcon {\n top: -0.2rem;\n left: 0.5rem;\n position: absolute;\n width: 0.8rem;\n height: 0.8rem;\n }\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './lite-owner-avatar.module.scss';\n\ninterface LiteOwnerAvatarProps {\n video: VideoTypes;\n imageCdnUrl: string;\n size?: VideoItemSize;\n}\n\nexport function LiteOwnerAvatar(props: LiteOwnerAvatarProps): JSX.Element {\n if (!VideoHelper.isInteractive(props.video) && !VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._liteOwner && !props.video._isClickViewCurated?.value)\n return <></>;\n\n if (props.video._isClickViewCurated?.value) {\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1 rounded-circle position-relative bg-white`}>\n <SvgContainer2 className={props.size === 'sm' ? styles.smIcon : styles.stdIcon}>\n <ClickViewLogoMark />\n </SvgContainer2>\n </div>\n );\n }\n\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.video._liteOwner.name, props.video._liteOwner.surname)}\n imageUrl={props.video._liteOwner.avatar?.url}\n />\n </div>\n );\n}\n",":local {\n .pluginHover {\n z-index: 6;\n\n &:hover {\n opacity: 1!important;\n background-color: rgba(0,0,0,0.5);\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './plugin-hover.module.scss';\n\nconst namespace = 'shared.pluginHover';\n\ninterface PluginHoverProps {\n isPlugin: boolean;\n isPluginPopup: boolean;\n className?: string;\n onClick?: () => void;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function PluginHover(props: PluginHoverProps): JSX.Element {\n if (!props.isPlugin || props.isPluginPopup)\n return <></>;\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n onClick={props.onClick}\n className={`\n position-absolute top-0 start-0 end-0 bottom-0 opacity-0 cursor-pointer\n ${styles.pluginHover}\n ${props.className ? props.className : ''}\n `}\n >\n <span className='position-absolute top-50 start-50 translate-middle text-nowrap h4 text-white'>\n <Text namespace={namespace} phrase='embed' />\n </span>\n </AppLink>\n );\n}\n",":local {\n .padlock {\n color: $dark;\n border-radius: 50%;\n width: 2rem;\n height: 2rem;\n opacity: 0.8;\n \n &.sm {\n width: $cv-svg-size;\n height: $cv-svg-size;\n }\n }\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\n\nimport styles from './thumbnail-padlock.module.scss';\n\ninterface ThumbnailPadlockProps {\n size?: VideoItemSize;\n}\n\nexport function ThumbnailPadlock(props: ThumbnailPadlockProps): JSX.Element {\n const svgSize = props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard;\n\n return (\n <div className={`${styles.padlock} ${props.size === 'sm' ? styles.sm : ''} bg-white cursor-default d-flex align-items-center justify-content-center`}>\n <SvgContainer svg={LockSvg} size={svgSize} />\n </div>\n );\n}\n",":local {\n $size: 1.875rem;\n $size-sm: 1.5rem;\n\n .logo {\n width: $size;\n height: $size;\n border-radius: 50%;\n overflow: hidden;\n background-size: contain;\n background-position: center;\n\n &.sm {\n width: $size-sm;\n height: $size-sm;\n }\n }\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './thumbnail-company-logo.module.scss';\n\ninterface ThumbnailCompanyLogoProps {\n companyLogoFallbackUrl: string;\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nThumbnailCompanyLogo.defaultProps = {\n size: 'md'\n};\n\nexport function ThumbnailCompanyLogo(props: ThumbnailCompanyLogoProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video) || !props.companyLogoFallbackUrl)\n return <></>;\n\n const company = props.video.productionCompanies?.data?.[0];\n const url = ImageHelper.createUrl(company?.logo?.url ?? props.companyLogoFallbackUrl, { size: ImageSize.Small });\n const logoFallbackBgClassName = getBgColorClass(company.name, BG_COLOUR_CLASS_NAMES);\n \n if (!url)\n return <></>;\n\n return (\n <div>\n <Tooltip\n title={company?.name}\n spanHack\n >\n <div\n className={`${styles.logo} ${props.size === 'sm' ? styles.sm : ''} ${!company?.metadata?.colour && logoFallbackBgClassName}`}\n style={{\n backgroundImage: `url(${url})`,\n backgroundColor: company?.metadata?.colour\n }}\n />\n </Tooltip>\n </div>\n );\n}\n","export const NumberHelper = {\n padNumber(num: number, padLength: number): string {\n let numberString = num.toString();\n\n if (numberString.length >= padLength)\n return numberString;\n\n padLength = padLength - numberString.length;\n\n while (padLength > 0) {\n numberString = '0' + numberString;\n padLength--;\n }\n return numberString;\n }\n};\n","import { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Rating, Series } from 'libs/shared/interfaces';\n\nimport { NumberHelper } from './NumberHelper';\n\nexport const SeriesHelper = {\n isSeries(obj: BaseObject): obj is Series {\n return obj?.typeId === MasterType.Series;\n },\n\n buildSeriesSeasonEpisodeText(seriesName: string, season?: number, episode?: number): string {\n if (!seriesName)\n return '';\n\n if (!season || !episode)\n return seriesName.toUpperCase();\n\n const seasonNum = NumberHelper.padNumber(season, 2);\n const episodeNum = NumberHelper.padNumber(episode, 2);\n\n return `${seriesName.toUpperCase()} S${seasonNum} • E${episodeNum}`;\n },\n\n getRating(series: Series): Rating {\n return series._rating?.value;\n }\n};\n",":local {\n .appLink {\n color: inherit;\n\n &:hover {\n .hoverUnderline {\n text-decoration: underline;\n }\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, UserAction } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { NumberHelper } from 'libs/shared/utils/NumberHelper';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TitleSubText } from '../title-sub-text/TitleSubText';\n\nconst namespace = 'shared.videoSubText';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './video-sub-text.module.scss';\n\nexport type VideoSubTextType = 'series' | 'productionCompany' | 'none';\n\ninterface SeriesLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n withSeriesTitle?: boolean;\n size?: 'sm' | 'lg';\n}\n\nexport function SeasonEpisode(props: Omit<SeriesLinkProps, 'analyticsOptions' | 'analyticsData'>): JSX.Element {\n const { video } = props;\n const { season } = video;\n\n if (!video.episodeNumber || !season)\n return <></>;\n\n const seasonNumber = NumberHelper.padNumber(season.number, 2);\n const episodeNumber = NumberHelper.padNumber(video.episodeNumber, 2);\n\n /* \\u2022 is the unicode number for • */\n return (\n <span className={`d-inline-block ${props.appLink ? styles.hoverUnderline : ''}`}>\n {props.withSeriesTitle && <> </>}\n {!!seasonNumber && `S${seasonNumber} \\u2022 `}\n E{episodeNumber}\n </span>\n );\n}\n\nfunction ReleaseDate(props: SeriesLinkProps): JSX.Element {\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if (!releaseDate)\n return <></>;\n\n if (VideoHelper.hasSeries(props.video))\n return <>{` \\u2022 ${releaseDate}`}</>;\n\n return <>{releaseDate}</>;\n}\n\nfunction SeriesLink(props: SeriesLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const series = video?.series;\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if ((!series?.id) && !releaseDate)\n return <></>;\n\n const seriesAppLink: Core.AppLink = series?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ series.id, TextHelper.slugify(series.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: series?.id,\n name: series?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Series,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n const seriesTitle = SeriesHelper.buildSeriesSeasonEpisodeText(\n series?.name,\n video.season?.number,\n video.episodeNumber\n );\n\n return (\n <TitleSubText\n appLink={seriesAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={seriesTitle}\n ariaLabel={`${getPhrase('ariaSeries')} ${seriesTitle}`}\n >\n {series?.name && series.name}\n <SeasonEpisode {...props} withSeriesTitle />\n <ReleaseDate {...props} />\n </TitleSubText>\n );\n}\n\ninterface ProductionCompanyLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nfunction ProductionCompanyLink(props: ProductionCompanyLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const productionCompany = video?.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return <></>;\n\n const companyAppLink: Core.AppLink = productionCompany?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: productionCompany?.id,\n name: productionCompany?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Company,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n return (\n <TitleSubText\n appLink={companyAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={productionCompany.name}\n ariaLabel={`${getPhrase('ariaCompany')} ${productionCompany.name}`}\n >\n {productionCompany.name}\n </TitleSubText>\n );\n}\n\ninterface VideoSubTextProps {\n type: VideoSubTextType;\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nexport function VideoSubText(props: VideoSubTextProps): JSX.Element {\n const { type = 'series' } = props;\n\n if (type === 'none')\n return <></>;\n\n if (type === 'series')\n return <SeriesLink {...props} />;\n\n return <ProductionCompanyLink {...props} />;\n}\n\n","import React from 'react';\n\nexport function ClipSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M14.893 16.357a2.5 2.5 0 0 1 1.806-1.354 2.506 2.506 0 0 1 2.902 2.042 2.516 2.516 0 0 1-2.032 2.916 2.5 2.5 0 0 1-2.74-1.494l-2.603-5.208-2.57 5.138a2.504 2.504 0 0 1-2.769 1.564 2.516 2.516 0 0 1-2.031-2.916 2.506 2.506 0 0 1 2.901-2.042c.81.144 1.46.663 1.803 1.348l2.107-4.212-3.703-7.41a.504.504 0 0 1 .222-.675.5.5 0 0 1 .672.223l3.369 6.743 3.372-6.743a.5.5 0 0 1 .671-.223.504.504 0 0 1 .223.674l-3.707 7.412zm-9.053.863a1.51 1.51 0 0 0 1.221 1.752 1.505 1.505 0 0 0 1.743-1.227 1.51 1.51 0 0 0-1.22-1.752A1.505 1.505 0 0 0 5.84 17.22m11.555 1.752a1.51 1.51 0 0 0 1.221-1.752 1.505 1.505 0 0 0-1.743-1.227 1.51 1.51 0 0 0-1.22 1.752 1.505 1.505 0 0 0 1.742 1.227'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function InteractiveSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.91 4.025c-3.308 0-6 2.692-6 6 0 1.923.916 3.716 2.462 4.846v3.77c0 .763.621 1.384 1.385 1.384h4.308c.763 0 1.384-.62 1.384-1.384v-3.77a6 6 0 0 0 2.462-4.846c0-3.308-2.692-6-6-6m2.616 12.77v.615h-5.23v-.615zm-4.77 2.307a.46.46 0 0 1-.46-.461v-.308h5.23v.308a.46.46 0 0 1-.461.461zm4.77-4.471v1.24h-5.23v-1.24a.46.46 0 0 0-.205-.384 5.07 5.07 0 0 1-2.257-4.222c0-2.8 2.277-5.077 5.077-5.077s5.077 2.278 5.077 5.077a5.07 5.07 0 0 1-2.257 4.222.46.46 0 0 0-.205.384m-2.396-2.616a.56.56 0 0 0 .107-.348v-.068q.004-.237.076-.402a1 1 0 0 1 .235-.317q.165-.153.454-.35.462-.316.757-.724.294-.41.295-.97 0-.591-.283-.993a1.8 1.8 0 0 0-.76-.61 2.6 2.6 0 0 0-1.05-.208q-.629 0-1.151.279-.525.277-.78.825a1.2 1.2 0 0 0-.12.522.44.44 0 0 0 .105.303q.105.118.3.118.162 0 .271-.091a.5.5 0 0 0 .157-.247q.162-.518.471-.704.309-.187.718-.187.343 0 .62.119.28.118.443.339.164.22.164.53 0 .27-.104.467-.106.195-.28.35a5 5 0 0 1-.391.305q-.281.195-.516.419a1.9 1.9 0 0 0-.378.498 1.3 1.3 0 0 0-.143.613v.193q0 .213.114.346.114.134.338.133.224 0 .33-.14m.088 2.081a.6.6 0 0 0 .17-.426.6.6 0 0 0-.17-.428.57.57 0 0 0-.424-.177q-.242 0-.416.177a.59.59 0 0 0-.174.428.6.6 0 0 0 .174.426q.174.18.416.18.252 0 .424-.18'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ResourcesSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.06 4c.519 0 .94.479.94 1.075v13.85c0 .594-.419 1.075-.94 1.075H5.94c-.519 0-.94-.479-.94-1.075V5.075C5 4.48 5.419 4 5.94 4zM9.256 5H5.882v.184l-.001.1v.418l-.001.175-.001 1.113v1.429l-.001.314v2.024l-.001.352-.001 3.162v.335l-.001 4.386h.105l.08.001h.36l.157.001h.571l.221.001h.741l.27.001h1.174l.313.001h1.63l.332.001 2.61.001h.305l3.362.001h.012v-.184l.001-.1v-.418l.001-.175.001-1.113v-1.429l.001-.314v-2.024l.001-.352.001-3.162v-.335l.001-4.374v-.012h-.105l-.08-.001h-.36l-.157-.001h-.571l-.221-.001h-.741l-.27-.001h-1.174l-.313-.001h-1.63l-.332-.001-2.61-.001zm1.438 8c.238 0 .431.224.431.5s-.193.5-.431.5H8.056c-.238 0-.431-.224-.431-.5s.193-.5.431-.5zm5.198-3c.267 0 .483.224.483.5s-.216.5-.483.5H8.108a.49.49 0 0 1-.483-.5c0-.276.216-.5.483-.5zm0-3c.267 0 .483.224.483.5s-.216.5-.483.5H8.108a.49.49 0 0 1-.483-.5c0-.276.216-.5.483-.5z'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n $badge-size: 1.875rem;\n $badge-size-sm: 1.5rem;\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .draft {\n background-color: $gray-700;\n }\n\n .badge {\n display: flex;\n align-items: center;\n min-width: $badge-size;\n width: $badge-size;\n height: $badge-size;\n transition: width .3s;\n overflow: hidden;\n position: relative;\n\n .svg {\n min-width: $cv-svg-size;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n\n svg {\n vertical-align: top;\n }\n }\n\n .text {\n display: none;\n line-height: $badge-size;\n }\n\n &.sm {\n min-width: $badge-size-sm;\n width: $badge-size-sm;\n height: $badge-size-sm;\n\n .svg {\n min-width: $cv-svg-size-sm;\n }\n\n .text {\n font-size: 80%;\n line-height: $badge-size-sm;\n }\n }\n\n &:hover {\n width: 100%;\n padding-right: map-get($spacers, 2);\n\n .text {\n display: block;\n }\n\n .svg {\n margin-left: 0.2rem;\n position: relative;\n left: 0.75rem;\n }\n\n &.sm {\n .svg {\n left: 0.55rem;\n }\n }\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClipSvg } from 'libs/shared/images/svg/objects/ClipSvg';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\n\nimport styles from './type-badge.module.scss';\n\nconst namespace = 'shared.typeBadge';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getText(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Clip:\n return getPhrase('clip');\n case MasterType.Interactive:\n return getPhrase('interactive');\n case MasterType.Resource:\n return getPhrase('resource');\n default:\n return '';\n }\n}\n\nfunction getIcon(typeId: MasterType) {\n switch (typeId) {\n case MasterType.Clip:\n return ClipSvg;\n case MasterType.Interactive:\n return InteractiveSvg;\n case MasterType.Resource:\n return ResourcesSvg;\n default:\n return null;\n }\n}\n\nfunction getColourClass(typeId: MasterType, status: CurationStatus): string {\n switch (typeId) {\n case MasterType.Clip:\n return 'bg-ultramarine';\n case MasterType.Interactive:\n return status === CurationStatus.Draft ? styles.draft : 'bg-green';\n case MasterType.Resource:\n return 'bg-indigo';\n default:\n return '';\n }\n}\n\ninterface TypeBadgeProps {\n typeId: MasterType;\n status?: CurationStatus;\n size?: 'sm' | 'md';\n inContainer?: boolean;\n}\n\nTypeBadge.default = {\n size: 'md'\n};\n\nexport function TypeBadge(props: TypeBadgeProps): JSX.Element {\n const baseClasses = `${styles.badge} rounded-pill text-white ps-0 ${props.size === 'sm' ? styles.sm : ''}`;\n\n return (\n <div className={props.inContainer ? '' : styles.topLeftContainer}>\n <div className={`${baseClasses} ${getColourClass(props.typeId, props.status)}`}>\n <SvgContainer\n className={`svg-container d-block ${styles.svg}`}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n svg={getIcon(props.typeId)}\n />\n <span className={styles.text}>\n {getText(props.typeId)}\n </span>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces/VideoTypes';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TypeBadge } from '../type-badge/TypeBadge';\n\ninterface VideoTypeBadgeProps {\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nVideoTypeBadge.default = {\n size: 'md'\n};\n\nexport function VideoTypeBadge(props: VideoTypeBadgeProps): JSX.Element {\n if (VideoHelper.isClip(props.video))\n return <TypeBadge typeId={MasterType.Clip} size={props.size} inContainer />;\n\n if (VideoHelper.isInteractive(props.video))\n return (\n <TypeBadge\n typeId={MasterType.Interactive}\n status={props.video.status}\n size={props.size}\n inContainer\n />\n );\n\n return <></>;\n}\n",":local {\n .hoverContainer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 6;\n opacity: 0;\n transition: opacity .5s;\n }\n\n .hovering {\n opacity: 1;\n }\n\n .theatreModeOn {\n > :global(.cv-theatre-mode-video-container) {\n width: 100%;\n height: 100%;\n aspect-ratio: 16 / 9;\n max-height: min(80vh, calc(100vw * 9 / 16));\n\n // Fix in Safari the child element will overflow - force child's height to be limited by parent\n display: flex;\n flex-direction: column;\n }\n }\n}","import React from 'react';\nimport { OutPortal } from 'react-reverse-portal';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './global-player-consumer.module.scss';\n\ninterface GlobalPlayerConsumerOptions extends PlayerInitializationData {\n location?: 'popout-video' | 'play-page';\n}\n\nexport function GlobalPlayerConsumer(props: GlobalPlayerConsumerOptions): JSX.Element {\n const playerContext = usePlayerContext();\n\n playerContext.useInitialize?.(props);\n\n if (!playerContext.hasProvider)\n return <></>;\n\n if (playerContext.mode === 'picture-in-picture')\n return <></>;\n\n if (props.mode === 'hover' && playerContext.isOnPlayPage)\n return <></>;\n \n if (props.location === 'play-page') {\n // we don't want to add theatreModeOn style for interactive preview\n const theatreMode = playerContext.defaultDisplayMode === 'theatre' && props.objectTypeId !== MasterType.Interactive;\n return (\n <div className={theatreMode ? `w-100 h-100 ${styles.theatreModeOn}` : ''}>\n <OutPortal node={playerContext.portalNode} />\n </div>\n );\n }\n\n if (playerContext.mode !== 'hover')\n return <></>;\n\n /**\n * When hovering, we don't want to show the player until the video has started playing.\n */\n const shouldShow = playerContext.started;\n\n let rounding = 'rounded-3';\n if (props.location === 'popout-video')\n rounding = 'rounded-top-3';\n\n const className = `${styles.hoverContainer} ${shouldShow ? styles.hovering : ''} ${rounding} overflow-hidden`;\n\n /**\n * If the user clicks before GlobalPlayerView calls setPlayerMode('hover') to bind the click handler,\n * we still need to persist the player reference in the PlayerContext. Otherwise it will be set to null. - Sha\n */\n function onClick(): void {\n if (!props.appLink)\n return;\n\n playerContext.setPersist();\n }\n\n return (\n <AppLink className={className} onClick={onClick} appLink={props.appLink}>\n <OutPortal node={playerContext.portalNode} />\n </AppLink>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n $video-progress-height: 0.25rem;\n $interactive-and-clip-progress-height: 1.25rem;\n $overlay-index: 2;\n $overlay-actions-index: 3;\n\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: $overlay-index;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .topRightContainer {\n position: absolute;\n top: 0;\n right: 0;\n\n padding-top: map-get($spacers, 2);\n padding-right: map-get($spacers, 2);\n z-index: $overlay-actions-index;\n\n transform: translate3d(0,0,0);\n }\n\n .overlay {\n color: inherit;\n line-height: 1.2;\n position: absolute;\n bottom: 0;\n left: 0;\n\n padding: map-get($spacers, 2);\n padding-top: 0;\n width: 100%;\n\n @include media(\"<=sm\") {\n padding-bottom: map-get($spacers, 1);\n }\n\n &.downScale {\n transform: scale(0.9);\n\n margin-left: -1rem;\n margin-bottom: -0.2rem;\n }\n }\n\n .title {\n @include media(\"<=sm\") {\n margin-bottom: 0 !important;\n }\n }\n\n .gradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playIcon {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 4;\n color: $white;\n transform: translate3D(-50%, -50%, 0);\n transition: opacity 100ms ease-in-out;\n width: 2.75rem;\n height: 2.75rem;\n }\n\n .videoProgress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: $video-progress-height;\n }\n\n .videoProgress + .badgeContainer {\n bottom: map-get($spacers, 1) + $video-progress-height;\n }\n\n .clipProgress,\n .interactiveProgress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: $navy;\n height: $interactive-and-clip-progress-height;\n opacity: .9\n }\n\n .clipProgress + .badgeContainer,\n .interactiveProgress + .badgeContainer {\n bottom: map-get($spacers, 1) + $interactive-and-clip-progress-height;\n }\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { ExpandableVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { CloseCaptionBadgeSvg } from 'libs/shared/images/svg/status/CloseCaptionBadgeSvg';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './expandable-video-thumbnail.module.scss';\n\nfunction getTitleClass(hovering: boolean): string {\n let className = 'mb-1';\n\n if (hovering) {\n className += styles.downScale;\n }\n \n return className;\n}\n\nexport function ExpandableVideoThumbnail(props: ExpandableVideoThumbnailProps): JSX.Element {\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(props.video);\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(props.appLink?.params) ? props.appLink?.params as HashObject : {};\n\n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n };\n\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, props.hovering);\n const isVideo = VideoHelper.isVideo(props.video);\n\n const rating = VideoHelper.getRating(props.video);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n\n const showThumbnailPreviewVideo = isThumbnailHovering && canConsume && hoverToPlay;\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <div className='position-relative rounded-3 overflow-hidden' ref={thumbnailHoverRef}>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className='rounded-3'\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n\n {showFavouriteButton &&\n <div className={styles.topRightContainer}>\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n />\n </div>\n }\n {/* top right */}\n {!canNavigate && (\n <div className={styles.topRightContainer}>\n <ThumbnailPadlock />\n </div>\n )}\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={props.video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n\n <VideoTypeBadge video={props.video} />\n\n <ThumbnailCompanyLogo\n video={props.video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(props.video)}\n />\n </div>\n\n <BaseImage\n data={VideoHelper.getThumbnail(props.video)}\n appLink={canNavigate ? props.appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={props.imageOptions}\n preload={props.preload}\n className={styles.gradient}\n alt={('series' in props.video && props.video.series?.name ? `${props.video.series.name}: ` : '') + props.video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n >\n {!!(props.hovering && canNavigate) && (\n <SvgContainer className={styles.playIcon} svg={PlayCircleSvg} />\n )}\n\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n <div className={styles.overlay}>\n <div className={`${getTitleClass(props.hovering)} ${styles.title}`}>\n {isVideo && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-shadow clamp-1'\n video={props.video}\n appLink={null}\n analyticsOptions={null}\n />\n )}\n\n <span className='h6 text-reset text-shadow clamp-1'>\n {VideoHelper.getTitle(props.video)}\n </span>\n </div>\n\n <VideoThumbnailBottomBar video={props.video} />\n\n {props.hovering && (\n <BadgeListContainer className='mt-1'>\n {VideoHelper.isVideo(props.video) && (\n <>\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n {props.video.hasSubtitle && (\n <span className='badge p-0'>\n <SvgContainer svg={CloseCaptionBadgeSvg} />\n </span>\n )}\n <Badge\n type={BadgeType.Interactive}\n data={props.video.hasInteractives}\n />\n <Badge\n type={BadgeType.DurationExact}\n data={VideoHelper.getDuration(props.video)}\n />\n </>\n )}\n </BadgeListContainer>\n )}\n </div>\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={canNavigate ? props.appLink : null}\n />\n }\n </div>\n </Tooltip>\n );\n}\n","import React from 'react';\nimport { HtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\ninterface VideoPreviewContext {\n setPreviewContentNode?: (node: HtmlPortalNode) => void;\n}\n\nexport const VideoPreviewContext = React.createContext<VideoPreviewContext>({});\n\nexport const VideoPreviewContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ node, setNode ] = React.useState<HtmlPortalNode>(null);\n\n return (\n <VideoPreviewContext.Provider value={{ setPreviewContentNode: setNode }}>\n {node && (\n <OutPortal node={node}/>\n )}\n {props.children}\n </VideoPreviewContext.Provider>\n );\n};\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nexport function useHoverLogger(\n isHovering: boolean,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n): void {\n const [ hasHovered, setHasHovered ] = React.useState(isHovering);\n const timeStartedHovering = React.useRef<Date>(isHovering ? new Date() : null);\n\n React.useEffect(() => {\n if (!analyticsData || !analyticsOptions)\n return;\n\n if (!analyticsOptions.entity || !analyticsData.location)\n return;\n\n if (isHovering) {\n if (!hasHovered)\n setHasHovered(true);\n\n timeStartedHovering.current = new Date();\n\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Hover\n });\n } else {\n if (!hasHovered)\n return;\n\n const timeHoveredInMilliseconds = new Date().getTime() - timeStartedHovering.current.getTime();\n timeStartedHovering.current = null;\n\n AnalyticsHelper.logUserAction({\n ...analyticsData,\n timeHoveredInMilliseconds,\n timeHoveredInSeconds: timeHoveredInMilliseconds / 1000\n }, {\n ...analyticsOptions,\n actionType: UserAction.Unhover\n });\n }\n }, [isHovering]);\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nconst EDGE_THRESHOLD = 8; // in px\nconst DEFAULT_SCALE = 1.2; // if no fixedWidth provided\n\nenum TransformOrigin {\n Left = '8px',\n Right = 'calc(100% - 8px)',\n Center = 'center'\n}\n\ninterface ParentRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type HoverPositionConfig = {\n width: number,\n height: number,\n top: number,\n left: number,\n transformOrigin: TransformOrigin,\n position: string,\n originalWidth: number,\n originalHeight: number\n};\n\nexport const calculatePosition = (\n parentDOMRect: ParentRect,\n fixedWith?: number,\n minWidth?: number,\n scale: number = DEFAULT_SCALE\n): HoverPositionConfig | HashObject => {\n const { x, y, width, height } = parentDOMRect;\n \n const contentReferenceEle = document.getElementById('content-width-reference');\n if (!contentReferenceEle) return {};\n\n let newX: number;\n\n let previewWidth = fixedWith || width * scale;\n let previewHeight = fixedWith ? fixedWith * (height / width) : height * scale;\n\n let realScale = fixedWith ? previewWidth / width : scale;\n newX = x - (previewWidth - width) / 2 ;\n\n if (previewWidth < minWidth) {\n newX = newX - (minWidth - previewWidth) / 2;\n previewWidth = minWidth;\n realScale = previewWidth / width;\n previewHeight = height * realScale;\n }\n\n const newY = y - (previewHeight - height) / 2 + window.scrollY;\n let left = newX;\n let transformOrigin = TransformOrigin.Center;\n // too close to the left\n if (newX - contentReferenceEle.offsetLeft < EDGE_THRESHOLD) {\n left = x - EDGE_THRESHOLD / 2;\n transformOrigin = TransformOrigin.Left;\n }\n // too close to the right\n if (contentReferenceEle.offsetWidth + contentReferenceEle.offsetLeft - (newX + previewWidth) < EDGE_THRESHOLD) {\n left = fixedWith ? x + width - fixedWith : x - width * (realScale - 1) + EDGE_THRESHOLD;\n transformOrigin = TransformOrigin.Right;\n }\n\n return { left, top: newY, height: previewHeight, width: previewWidth, transformOrigin, position: 'absolute', originalWidth: width, originalHeight: height };\n};\n",":local {\n .positionWrapper {\n z-index: $cv-hover-portal-z-index; \n }\n .animationWrapper {\n animation: zoom 0.8s ease-in;\n }\n @keyframes :local(zoom) {\n 0% {\n transform: scale(var(--scale));\n }\n 20% {\n transform: scale(var(--scale)/5);\n }\n }\n}","import React from 'react';\nimport { createHtmlPortalNode, InPortal } from 'react-reverse-portal';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { VideoPreviewContext } from 'libs/shared/context/VideoPreviewContext';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useHoverLogger } from 'libs/shared/hooks/UseHoverLogger';\n\nimport { calculatePosition, HoverPositionConfig } from './hoverToPortalContainerUtil';\n\nimport styles from './hover-to-portal-container.module.scss';\n\nexport interface HoverableProps {\n isHovering: boolean;\n thumbnailHoverRef?: any;\n hoverPositionConfig?: HoverPositionConfig | HashObject;\n cleanPortalNode?: () => void;\n}\n\ninterface HoverToPortalContainerProps<T=any> {\n hoverableComponent: (props: HoverableProps) => JSX.Element;\n componentProps: T;\n fixedHoverWidth?: number;\n minHoverWidth?: number;\n hoverScale?: number;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function HoverToPortalContainer<T=any>(props: HoverToPortalContainerProps<T>): JSX.Element {\n const { hoverableComponent, componentProps, minHoverWidth, fixedHoverWidth, hoverScale } = props;\n const { setPreviewContentNode } = React.useContext(VideoPreviewContext);\n if (setPreviewContentNode === undefined) {\n Core.ErrorHelper.throw(new DevError(`Please use VideoPreviewContext inside a VideoPreviewContextProvider`));\n }\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const [ hoverCardRef, isHoverCardHovering ] = useHover<HTMLDivElement>();\n\n // eslint-disable-next-line\n const [ debugShow, setDebugShow ] = React.useState(false);\n\n const videoPositionRef = React.useRef<HTMLDivElement>(null);\n const prevStatus = React.useRef<boolean>(false);\n const currentIsHovering = isThumbnailHovering || isHoverCardHovering;\n\n useHoverLogger(currentIsHovering, props.analyticsData, props.analyticsOptions);\n\n React.useEffect(() => {\n if (prevStatus.current === currentIsHovering)\n return;\n if (currentIsHovering || debugShow) {\n setPreviewContentNode(portalNode);\n } else {\n setPreviewContentNode(null);\n }\n prevStatus.current = currentIsHovering;\n }, [currentIsHovering]);\n\n /**\n * Uncomment this if you want the hover to portal container to persist after a single hover\n * so you can inspect it's html - Sha\n */\n // React.useEffect(() => {\n // if (currentIsHovering)\n // setDebugShow(true);\n // }, [currentIsHovering]);\n\n const { x, y, width, height } = videoPositionRef.current?.getBoundingClientRect?.() || {};\n\n const hoverPositionConfig = React.useMemo(\n () => calculatePosition({ x, y, width, height }, fixedHoverWidth, minHoverWidth, hoverScale),\n [ x, y, width, height, hoverScale ]\n );\n const scale = hoverPositionConfig ? hoverPositionConfig.originalWidth / hoverPositionConfig.width : 1;\n\n const HoverableComponent = hoverableComponent;\n\n return (\n <div ref={videoPositionRef} >\n <div ref={thumbnailHoverRef}>\n <HoverableComponent isHovering={false} {...componentProps}/>\n </div>\n\n {(currentIsHovering || debugShow) && (\n <InPortal node={portalNode}>\n <div\n className={`${styles.positionWrapper} ${styles.animationWrapper}`}\n style={{\n '--scale': scale,\n ...hoverPositionConfig\n } as unknown as React.CSSProperties}\n ref={hoverCardRef}\n >\n <HoverableComponent\n isHovering={true}\n hoverPositionConfig={hoverPositionConfig}\n cleanPortalNode={() => setPreviewContentNode(null)}\n {...componentProps}/>\n </div>\n </InPortal>\n )}\n </div>\n );\n}\n\nHoverToPortalContainer.ReferenceContainer = (props: React.PropsWithChildren) => {\n return (\n <div id='content-width-reference' className='flex-grow-1'>\n {props.children}\n </div>\n );\n};\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}\n","@import '~styles/utils/mixins';\n:local {\n .badgeContainer {\n position: absolute;\n bottom: map-get($spacers, 2);\n right: map-get($spacers, 2);\n z-index: 2;\n \n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n \n :global(.duration-badge-new) {\n @include thumbnail-poster-badge;\n line-height: 1.3;\n }\n\n &.sm {\n :global(.duration-badge-new) {\n font-size: 90%;\n height: 1.3rem;\n line-height: 1.1;\n }\n }\n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Audience, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-thumbnail-badges.module.scss';\n\ninterface VideoThumbnailBadgesProps {\n video?: Video;\n audience?: Audience;\n hideRating?: boolean;\n hideDuration?: boolean;\n newDurationStyle?: boolean;\n size?: VideoItemSize;\n duration?: number;\n}\n\nVideoThumbnailBadges.defaultProps = {\n newDurationStyle: true,\n size: 'md'\n};\n\nexport function VideoThumbnailBadges(props: VideoThumbnailBadgesProps): JSX.Element {\n const rating = VideoHelper.getRating(props.video);\n\n const showAudience = !!props.audience && props.size !== 'sm';\n const showRating = !showAudience && !props.hideRating && !!rating && props.size !== 'sm';\n\n if (props.hideDuration && !showAudience && !showRating)\n return <></>;\n\n return (\n <BadgeListContainer className={`${styles.badgeContainer} ${props.size === 'sm' ? styles.sm : ''}`}>\n {showAudience && (\n <AudienceLabel\n audience={props.audience}\n className='bg-white text-dark'\n border='dark'\n />\n )}\n {showRating && (\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n )}\n {!props.hideDuration && (\n <Badge\n type={props.newDurationStyle ? BadgeType.DurationApproximate : BadgeType.DurationExact}\n data={props.duration || VideoHelper.getDuration(props.video)}\n />\n )}\n </BadgeListContainer>\n );\n}\n","import React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface RestrictionPadlockProps {\n tooltip?: string;\n className?: string;\n tooltipPlacement?: Placement;\n size?: VideoItemSize;\n video: VideoTypes;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionPadlock(props: RestrictionPadlockProps): JSX.Element {\n if (!props.yearGroups)\n return <></>;\n\n const title = RestrictionHelper.mapRestrictionToText(props.video._restrictions, props.yearGroups);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume || !title)\n return <></>;\n\n return (\n <Tooltip\n spanHack\n spanHackClassName={props.className || 'd-inline-block ps-1'}\n title={title}\n placement={props.tooltipPlacement || 'top'}\n >\n <SvgContainer\n svg={LockSvg}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n />\n </Tooltip>\n );\n}\n",":local {\n .dot {\n width: 0.5rem;\n height: 0.5rem;\n margin-bottom: 0.2rem;\n\n &.smallText {\n margin-bottom: 0.1rem;\n }\n }\n\n .title {\n line-height: 1.5;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './video-title.module.scss';\n\nconst namespace = 'shared.videoTitle';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst TODAY = new Date();\n\nexport type VideoTitleSizes = 'h4' | 'h5' | 'h6';\n\ninterface VideoTitleProps {\n video: Video;\n yearGroups?: YearGroup[];\n showNewVideoIndicator?: boolean;\n title?: string;\n showPadlock: boolean;\n\n lockSize?: 'sm' | 'md';\n titleSize?: VideoTitleSizes;\n className?: string;\n}\n\nfunction isDateInCurrentMonth(target: string) {\n return DateHelper.isSame(target, TODAY, 'year') && DateHelper.isSame(target, TODAY, 'month');\n}\n\nVideoTitle.defaultProps = {\n titleSize: 'h6',\n className: ''\n};\n\nexport function VideoTitle(props: VideoTitleProps): JSX.Element {\n const dateRelease = props.video.dateReleased;\n const isCurrentMonth = dateRelease && isDateInCurrentMonth(dateRelease);\n\n const shouldShowNewVideoIndicator = props.showNewVideoIndicator\n && isCurrentMonth\n && props.video._isClickViewCurated?.value;\n\n return (\n <>\n <Tooltip\n title={`${shouldShowNewVideoIndicator ? getPhrase('newVideo') : ''}`}\n spanHack\n spanHackClassName='d-inline-block'\n >\n {shouldShowNewVideoIndicator && (\n <span className={`rounded-circle bg-green d-inline-block me-1 ${styles.dot} ${props.titleSize === 'h6' ? styles.smallText : ''}`} />\n )}\n </Tooltip>\n\n <h2 className={`${props.titleSize} ${styles.title} ${props.className} d-inline`}>\n {props.title || props.video.name}\n </h2>\n\n {props.showPadlock && (\n <RestrictionPadlock\n video={props.video}\n yearGroups={props.yearGroups}\n size={props.lockSize}\n />\n )}\n </>\n );\n}\n\n","@import '~styles/utils/include-media';\n:local {\n .container {\n // This fixes https://clickview.atlassian.net/browse/INBOX-5387\n z-index: 10000;\n }\n\n .titleContainer{\n min-width: 0;\n }\n\n .badgeContainer {\n height: 1.5rem;\n }\n\n .audienceBadge {\n @include media('<=sm') {\n display: none;\n }\n }\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopoutVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './thumbnail-text.module.scss';\n\ntype VideoThumbnailTextProps = Pick<PopoutVideoThumbnailProps, 'video' | 'appLink' | 'commonVideoProps'>;\n\nexport function ThumbnailText(props: VideoThumbnailTextProps): JSX.Element {\n const { video, appLink } = props;\n const { canNavigate } = VideoHelper.getCanBeConsumed(video);\n\n return (\n <div className={`mt-2 ${styles.container}`}>\n <div className={`d-flex flex-column ${styles.titleContainer}`}>\n {VideoHelper.isVideo(video) && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-truncate'\n video={video}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n )}\n <AppLink className='text-reset clamp-2 align-middle' appLink={canNavigate ? appLink : null}>\n <VideoTitle\n video={props.video}\n yearGroups={props.commonVideoProps.yearGroups}\n lockSize='sm'\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n </div>\n </div>\n );\n}\n",":local {\n .tag {\n background-color: $gray-100;\n height: 2rem;\n\n .icon {\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n transform: scale(0.85);\n }\n }\n\n &:hover:not(.disabled) {\n background-color: $light-blue;\n }\n\n &.active {\n background-color: $light-blue;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { AppLink } from '../../app-link/AppLink';\n\nimport styles from './video-guidance-tag.module.scss';\n\ninterface VideoGuidanceTagProps {\n text: string;\n svg: SvgIcon;\n iconVariant: string;\n active?: boolean;\n appLink?: Core.AppLink;\n appLinkAnalyticsData?: HashObject;\n appLinkAnalyticsOptions?: AnalyticsOptions;\n theme?: {\n tabLabel?: string,\n container?: string\n };\n}\n\nfunction ContainerWrapper(props: VideoGuidanceTagProps): JSX.Element {\n if (props.appLink) {\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.appLinkAnalyticsData}\n analyticsOptions={props.appLinkAnalyticsOptions}\n className={`\n p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer\n text-decoration-none ${props.theme?.container} ${styles.tag} ${props.active ? styles.active : ''}\n `}\n >\n <VideoGuidanceTag {...props} />\n </AppLink>\n );\n }\n\n return (\n <div\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center ${props.theme?.container} ${styles.tag} ${styles.disabled}`}\n >\n <VideoGuidanceTag {...props} />\n </div>\n );\n}\n\nfunction VideoGuidanceTag(props: VideoGuidanceTagProps): JSX.Element {\n return (\n <>\n <SvgContainer\n className={`${styles.icon} rounded-circle bg-${props.iconVariant} text-white`}\n svg={props.svg}\n />\n\n <span className={`ps-1 text-nowrap user-select-none ${props.theme?.tabLabel}`}>\n {props.text}\n </span>\n </>\n );\n}\n\nexport { ContainerWrapper as VideoGuidanceTag };\n","import React from 'react';\n\nexport function GraduationCapSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M16.863 20c-.662 0-1.21-.567-1.21-1.252s.548-1.252 1.21-1.252c.663 0 1.21.567 1.21 1.252S17.527 20 16.864 20m0-1.441a.183.183 0 0 0-.182.189c0 .118.068.189.182.189.115 0 .183-.071.183-.19a.183.183 0 0 0-.183-.188m0-.118a.516.516 0 0 1-.502-.52v-6.19L11.75 9.158a.53.53 0 0 1-.205-.71c.137-.26.456-.354.685-.212l4.886 2.717a.57.57 0 0 1 .274.473v6.496a.52.52 0 0 1-.526.52m-4.908-4.205a.8.8 0 0 1-.229-.048L2.296 9.51A.55.55 0 0 1 2 9.014c0-.212.114-.401.297-.472l9.52-4.489a.47.47 0 0 1 .434 0l9.452 4.489a.55.55 0 0 1 .297.472.49.49 0 0 1-.297.473l-9.52 4.701a.8.8 0 0 1-.228.048m-8.22-5.198 8.22 4.087 8.288-4.087-8.22-3.898zm8.151 8.41c-4.749 0-6.644-2.905-6.712-3.047a.7.7 0 0 1-.092-.284V10.81c0-.283.229-.52.503-.52s.502.237.502.52v3.142c.388.496 2.077 2.434 5.776 2.434 3.653 0 5.548-1.938 6.005-2.457v-2.93c0-.284.228-.52.502-.52s.502.236.502.52v3.118a.6.6 0 0 1-.091.307c-.046.142-2.192 3.024-6.895 3.024'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.classroomGuideTag';\n\ninterface ClassroomGuideTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ClassroomGuideTag(props: ClassroomGuideTagProps): JSX.Element {\n if (!props.video || VideoHelper.isInteractive(props.video) || VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._hasCurriculumLinks?.value)\n return <></>;\n\n return (\n <VideoGuidanceTag\n theme={{\n container: 'classroom-guide-tag',\n tabLabel: 'classroom-guide-tag-label'\n }}\n svg={GraduationCapSvg}\n iconVariant='navy'\n text={LanguageService.getPhrase(namespace, 'curriculum')}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'curriculum',\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.interactivesTag';\n\ninterface InteractivesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function InteractivesTag(props: InteractivesTagProps): JSX.Element {\n if (!VideoHelper.showInteractivesGuidance(props.video))\n return <></>;\n \n const interactiveCount = !VideoHelper.isInteractive(props.video) && (props.video.interactives?.data.length || 0);\n\n return (\n <VideoGuidanceTag\n svg={InteractiveSvg}\n iconVariant='green'\n text={LanguageService.getPhrase(namespace, 'interactives', { smartCount: interactiveCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'interactive',\n videoGuidanceTotalItems: interactiveCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.resourcesTag';\n\nfunction getResourceCount(video: VideoTypes): number {\n if (VideoHelper.isInteractive(video))\n return 0;\n\n return (\n (video.resources?.data.length || 0) +\n (video.links?.data.length || 0)\n );\n}\n\ninterface ResourcesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ResourcesTag(props: ResourcesTagProps): JSX.Element {\n if (!VideoHelper.showResourcesGuidance(props.video))\n return <></>;\n\n const resourceCount = getResourceCount(props.video);\n\n return (\n <VideoGuidanceTag\n svg={ResourcesSvg}\n iconVariant='indigo'\n text={LanguageService.getPhrase(namespace, 'resources', { smartCount: resourceCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'resource',\n videoGuidanceTotalItems: resourceCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { ClassroomGuideTag } from 'libs/shared/components/video-guidance/classroom-guide/ClassroomGuideTag';\nimport { InteractivesTag } from 'libs/shared/components/video-guidance/interactives/InteractivesTag';\nimport { ResourcesTag } from 'libs/shared/components/video-guidance/resources/ResourcesTag';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemGuidanceProps {\n video: VideoTypes;\n getVideoAppLink?: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n containerClassName: string;\n responsiveClassName?: string;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoItemGuidance(props: VideoItemGuidanceProps): JSX.Element {\n const showingResourcesAndInteractives = (\n VideoHelper.showInteractivesGuidance(props.video) &&\n VideoHelper.showResourcesGuidance(props.video)\n );\n\n const showClassroomGuide = props.commonVideoProps.features.showClassroomGuide(props.video);\n\n return (\n <div className={`${props.containerClassName} ${showingResourcesAndInteractives ? props.responsiveClassName : ''}`}>\n {showClassroomGuide && (\n <ClassroomGuideTag\n appLink={props.commonVideoProps.getClassroomGuideAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n )}\n <ResourcesTag\n appLink={props.commonVideoProps.getResourceGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n <InteractivesTag\n appLink={props.commonVideoProps.getInteractiveGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n );\n}\n",":local {\n .button {\n background-color: rgba($gray-200, 0.8);\n border-radius: 50%;\n width: 1.875rem;\n height: 1.875rem;\n\n &:hover {\n background-color: rgba($gray-200, 0.9);\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nimport { DivButton } from '../../div-button/DivButton';\nimport { SvgContainer } from '../../svg-container/SvgContainer';\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './remove-video-button.module.scss';\n\nconst namespace = 'shared.removeVideoButton';\n\ninterface RemoveVideoButtonProps {\n onClickRemove: (e: React.MouseEvent<HTMLButtonElement>) => void;\n removeButtonTooltip?: string;\n preventFocus?: boolean;\n}\n\nexport function RemoveVideoButton(props: RemoveVideoButtonProps): JSX.Element {\n const tooltip = props.removeButtonTooltip || LanguageService.getPhrase(namespace, 'removeFromRow');\n\n return (\n <div className='me-2'>\n <Tooltip title={tooltip} spanHack>\n <DivButton\n onClick={props.onClickRemove}\n className={`d-flex align-items-center justify-content-center ${styles.button}`}\n tabIndex={props.preventFocus ? -1 : undefined}\n >\n <SvgContainer\n svg={CloseSvg}\n className={`svg-container ${styles.heart}`}\n />\n </DivButton>\n </Tooltip>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n:local {\n $overlay-index: 2;\n $overlay-actions-index: 3;\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .details {\n overflow-y: auto;\n display: none;\n\n &.isHovering {\n display: block;\n }\n }\n\n .videoGuidanceTags {\n z-index: 1;\n position: relative;\n box-shadow: none;\n transition: box-shadow .1s ease-in;\n padding: 0 0.94rem 0.94rem 0.94rem;\n }\n\n .responsiveGuidance {\n @include responsive-guidance-tags;\n }\n\n .dropdown {\n height: 0;\n transition: height .3s ease-in-out;\n\n &.show {\n height: 10rem;\n padding: 0 0.94rem 0.94rem 0.94rem;\n }\n }\n\n .topRightContainer {\n position: absolute;\n top: 0;\n right: 0;\n\n padding-top: map-get($spacers, 2);\n padding-right: map-get($spacers, 2);\n z-index: 5;\n\n transform: translate3d(0,0,0);\n\n display: flex;\n align-items: center;\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { HoverableProps, HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RemoveVideoButton } from '../../remove-button/RemoveVideoButton';\nimport { ThumbnailCompanyLogo } from '../../thumbnail-company/ThumbnailCompanyLogo';\nimport { PopoutVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './popout-video-thumbnail.module.scss';\n\ntype PopoutVideoProps = HoverableProps & PopoutVideoThumbnailProps;\n\nconst PopoutVideo = (props: PopoutVideoProps): JSX.Element => {\n const {\n video, appLink, imageOptions, preload, isHovering\n } = props;\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(appLink?.params) ? appLink?.params as HashObject : {};\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n React.useEffect(() => {\n return () => {\n props.cleanPortalNode?.();\n };\n }, []);\n\n function onClickRemove(e: React.MouseEvent<HTMLButtonElement>) {\n e.preventDefault();\n props.onClickRemove?.();\n }\n\n let className = 'position-relative bg-white';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n if (isHovering)\n className += ` rounded-3 shadow-lg`;\n \n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n };\n\n const showThumbnailPreviewVideo = props.isHovering && canConsume && hoverToPlay;\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, isHovering);\n\n function showRemoveButton() {\n if (!FunctionHelper.isFunction(props.onClickRemove))\n return false;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n return isHovering;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <div className={className}>\n <div className={styles.topRightContainer}>\n {showRemoveButton() && (\n <RemoveVideoButton\n onClickRemove={onClickRemove}\n removeButtonTooltip={props.removeButtonTooltip}\n preventFocus\n />\n )}\n\n {showFavouriteButton && (\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n preventFocus\n />\n )}\n\n {!canNavigate && (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <ThumbnailPadlock />\n </Tooltip>\n )}\n </div>\n\n <div className='position-relative'>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={isHovering ? 'rounded-top-3' : 'rounded-3'}\n onClick={() => props.cleanPortalNode?.()}\n appLink={canNavigate ? appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n <BaseImage\n onClick={() => props.cleanPortalNode?.()}\n data={VideoHelper.getThumbnail(video)}\n appLink={canNavigate ? appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus={!props.hideTitle}\n appLinkClassName={`position-absolute top-0 start-0 h-100 w-100 overflow-hidden ${isHovering ? 'rounded-top-3' : 'rounded-3'}`}\n imageClassName={isHovering ? 'rounded-top-3' : 'rounded-3'}\n >\n <ImageFallback type={ImageFallbackType.Video} />\n <div className='p-absolute w-100 h-100 text-white'>\n\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n \n <VideoTypeBadge video={video} />\n \n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n />\n </div>\n\n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n />\n\n {/* bottom */}\n <VideoThumbnailBottomBar video={props.video} />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n location='popout-video'\n onRemoveVideo={props.onClickRemove}\n appLink={canNavigate ? appLink : null}\n />\n }\n </div>\n\n {!isHovering && !props.hideTitle && (\n <ThumbnailText {...props}/>\n )}\n \n <div className={`${styles.details} ${isHovering ? `${styles.isHovering} box-shadow` : ''}`}>\n {isHovering && (\n <>\n <div className={`${isHovering ? styles.videoGuidanceTags : ''}`}>\n <ThumbnailText {...props}/>\n\n {(props.showVideoGuidance && isHovering) && (\n <VideoItemGuidance\n commonVideoProps={props.commonVideoProps}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n responsiveClassName={styles.responsiveGuidance}\n containerClassName='d-flex justify-content-start align-items-center pt-2'\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport function PopoutVideoThumbnail(props: PopoutVideoThumbnailProps): JSX.Element {\n return (\n <>\n <HoverToPortalContainer<PopoutVideoThumbnailProps>\n hoverableComponent={PopoutVideo}\n componentProps={props}\n fixedHoverWidth={400}\n minHoverWidth={400}\n analyticsData={{\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n }}\n analyticsOptions={{\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n }}\n />\n </>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleFilledSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 2;\n background-color: $black;\n opacity: 0;\n transition: opacity 100ms ease-in-out;\n }\n\n .small {\n .video {\n @extend %icon;\n width: 2rem;\n height: 2rem;\n } \n }\n\n .video {\n @extend %icon;\n width: 30%;\n height: 30%;\n }\n\n .playlist {\n @extend %icon;\n }\n\n %icon {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 4;\n color: $white;\n opacity: 0;\n transform: translate3D(-50%, -50%, 0);\n transition: opacity 100ms ease-in-out;\n }\n\n // Only purpose of this container is to trigger the hover event change\n // to the child elements\n .maskContainer {\n &:hover {\n .mask {\n opacity: 0.5;\n }\n\n .playlist,\n .video {\n opacity: 1;\n }\n }\n }\n\n .constantIconMaskContainer {\n %icon {\n color: $gray-900;\n }\n\n .mask {\n opacity: 0;\n }\n\n .playlist,\n .video {\n opacity: 0.8;\n }\n }\n}\n","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlayCircleFilledSvg } from 'libs/shared/images/svg/actions/PlayCircleFilledSvg';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\n\nimport styles from './mask.module.scss';\n\nexport enum MaskType {\n Video,\n Playlist,\n Series\n}\n\nfunction getClassByType(type: MaskType): string {\n if (type === MaskType.Video)\n return styles.video;\n\n if (type === MaskType.Playlist)\n return styles.playlist;\n\n return '';\n}\n\nfunction getSvg(type: MaskType, displayInverse: boolean = false) {\n if (type === MaskType.Video)\n return displayInverse ? PlayCircleFilledSvg : PlayCircleSvg;\n\n return null;\n}\n\ntype MaskSize = 'sm' | 'md';\n\ninterface MaskProps {\n type: MaskType;\n size?: MaskSize;\n alwaysShowIcon?: boolean;\n}\n\nMask.defaults = {\n size: 'md'\n};\n\nexport function Mask(props: MaskProps): JSX.Element {\n const { type, size, alwaysShowIcon } = props;\n\n const typeClass = getClassByType(type);\n const svg = getSvg(type, alwaysShowIcon);\n\n return (\n <div\n className={`${alwaysShowIcon ? styles.constantIconMaskContainer : styles.maskContainer} ${size === 'sm' ? styles.small : ''}`}\n >\n <div className={ styles.mask }></div>\n <SvgContainer svg={svg} className={ typeClass } />\n </div>\n );\n}\n","import React from 'react';\n\nexport function TickSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.783 5.192c.264.283.291.775.06 1.098l-8.91 12.444a.6.6 0 0 1-.457.266.58.58 0 0 1-.471-.228l-3.819-4.666a.905.905 0 0 1 0-1.1c.249-.304.652-.304.9 0l3.338 4.078 8.46-11.818c.232-.324.634-.356.899-.074'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n $badge-size: 1.875rem;\n\n .unchecked {\n color: $dark;\n background-color: rgba($gray-200, 0.5);\n\n &.outline {\n background-color: $white;\n border: 1px solid $dark;\n\n &[disabled] {\n border-color: $gray-400;\n color: $gray-400;\n }\n }\n\n &:not([disabled]):hover {\n color: $white;\n background-color: $green;\n opacity: 0.75;\n display: inline-block;\n border-color: $green;\n }\n }\n\n .checked {\n color: $white;\n background-color: $green;\n\n &.outline {\n border: 1px solid $green;\n }\n }\n\n .checkMark {\n width: $badge-size;\n height: $badge-size;\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TickSvg } from 'libs/shared/images/svg/status/TickSvg';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './check-mark-button.module.scss';\n\nexport enum CheckMarkStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n\nexport type SetCheckMarkStatusFunc = (status: CheckMarkStatus) => Promise<void>;\n\ninterface CheckMarkButtonProps {\n setStatus: SetCheckMarkStatusFunc;\n status: CheckMarkStatus;\n style?: 'outline' | 'filled';\n className?: string;\n disabled?: boolean;\n}\n\nCheckMarkButton.defaultProps = {\n style: 'filled'\n};\n\nexport function CheckMarkButton(props: CheckMarkButtonProps): JSX.Element {\n // Use local state so that changes are reflected immediately.\n const [ isComplete, setIsComplete ] = React.useState(props.status === CheckMarkStatus.Complete);\n\n React.useEffect(() => {\n setIsComplete(props.status === CheckMarkStatus.Complete);\n }, [props.status]);\n\n let className = `cursor-pointer rounded-circle ${isComplete ? styles.checked : styles.unchecked}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (props.style === 'outline')\n className += ` ${styles.outline}`;\n\n function shouldRender(): boolean {\n return (\n !!props.status &&\n props.status !== CheckMarkStatus.None &&\n FunctionHelper.isFunction(props.setStatus)\n );\n }\n\n function onClick(): void {\n const shouldComplete = !isComplete;\n\n setIsComplete(shouldComplete);\n\n const newStatus = shouldComplete ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete;\n\n props.setStatus(newStatus).catch(() => {\n setIsComplete(!shouldComplete);\n });\n }\n\n if (!shouldRender())\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} disabled={props.disabled}>\n <SvgContainer\n svg={TickSvg}\n className={`svg-container ${styles.checkMark}`}\n />\n </DivButton>\n );\n}\n",":local {\n .container {\n position: absolute;\n top: map-get($spacers, 2);\n right: map-get($spacers, 2);\n z-index: 5;\n\n &.cvIcon {\n svg {\n transform: scale(0.7) translateX(1.5px);\n }\n }\n \n .action {\n &:not(:first-child) {\n margin-left: map-get($spacers, 1);\n }\n }\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { CheckMarkButton, CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ThumbnailPadlock } from './padlock/ThumbnailPadlock';\n\nimport styles from './video-thumbnail-actions.module.scss';\n\nfunction hasActions(props: VideoThumbnailActionsProps): boolean {\n if (!VideoHelper.getCanBeConsumed(props.video)?.canConsume)\n return true;\n\n if (FunctionHelper.isFunction(props.setFavourite) && FunctionHelper.isFunction(props.canFavourite))\n return true;\n\n if (FunctionHelper.isFunction(props.setCheckMarkStatus))\n return true;\n\n return false;\n}\n\ninterface VideoThumbnailActionsProps {\n video: VideoTypes;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n checkMarkStatus?: CheckMarkStatus;\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n size?: VideoItemSize;\n}\n\nexport function VideoThumbnailActions(props: VideoThumbnailActionsProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canNavigate) {\n return (\n <div className={styles.container}>\n <ThumbnailPadlock size={props.size} />\n </div>\n );\n }\n \n if (!hasActions(props))\n return <></>;\n\n return (\n <div className={`${styles.container} d-flex align-items-center`}>\n <FavouriteButton\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n video={props.video}\n className={styles.action}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n preventFocus\n />\n\n <CheckMarkButton\n status={props.checkMarkStatus}\n setStatus={props.setCheckMarkStatus}\n className={styles.action}\n />\n </div>\n );\n}\n","export enum ThumbnailTextPosition {\n Below = 1,\n Overlay = 2,\n Independent = 3\n}\n",":local {\n $overlay-index: 2;\n\n .titleOverlay {\n color: inherit;\n line-height: 1.2;\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: $overlay-index;\n\n padding: map-get($spacers, 2);\n padding-top: 0;\n\n &.clip {\n padding-bottom: 0;\n bottom: map-get($spacers, 1) + $cv-clip-bottom-bar-height;\n\n &.large {\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height-lg;\n }\n }\n\n &.interactive {\n padding-bottom: 0;\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height;\n\n &.large {\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height-lg;\n }\n }\n }\n\n .titleBelow {\n margin-top: map-get($spacers, 1);\n line-height: 1.2;\n }\n\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .gradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.5) 05%,\n rgba(0, 0, 0, 0.4) 10%,\n rgba(0, 0, 0, 0.2) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0) 80%\n );\n }\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { VideoThumbnailActions } from 'libs/shared/components/thumbnails/thumbnail-actions/VideoThumbnailActions';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { CosmeticVideoThumbnailProps, StaticVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './static-video-thumbnail.module.scss';\n\nconst namespace = 'shared.staticVideoThumbnail';\n\ntype CombinedProps = StaticVideoThumbnailProps | CosmeticVideoThumbnailProps;\n\nfunction ThumbnailText(props: CombinedProps): JSX.Element {\n const { type, video, textPosition } = props;\n\n const isStatic = type === 'static';\n\n const textIsOverlayed = textPosition === ThumbnailTextPosition.Overlay;\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n let className = '';\n\n if (textIsOverlayed) {\n className = styles.titleOverlay;\n\n if (canNavigate) {\n if (VideoHelper.isClip(video))\n className += ' ' + styles.clip;\n if (VideoHelper.isInteractive(video))\n className += ' ' + styles.interactive;\n }\n } else {\n className = styles.titleBelow;\n }\n\n return (\n <div className={className}>\n {VideoHelper.isVideo(video) &&\n <VideoSubText\n type={isStatic ? props.commonVideoProps.subTextType : 'series'}\n className={textIsOverlayed ? 'text-shadow clamp-1' : 'clamp-2'}\n video={video}\n appLink={isStatic && !textIsOverlayed ? props.commonVideoProps.getSubTextAppLink?.(props.video) : null}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n }\n\n {(textIsOverlayed || !canNavigate || !isStatic) ?\n (\n <span className='h6 text-reset clamp-1'>\n <VideoTitle\n video={video}\n title={video.name ?? LanguageService.getPhrase(namespace, 'videoUnavailable')}\n showNewVideoIndicator={isStatic && props.commonVideoProps.showNewVideoIndicator}\n showPadlock={isStatic\n && !props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n />\n </span>\n ) : (\n <AppLink className='h6 text-reset clamp-2' appLink={props.appLink}>\n <VideoTitle\n video={video}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n )\n }\n </div>\n );\n}\n\nexport function StaticVideoThumbnail(props: CombinedProps): JSX.Element {\n const { type, video, textPosition, imageOptions, preload, alwaysShowIcon } = props;\n const hoverToPlay = 'commonVideoProps' in props ? props.commonVideoProps?.hoverToPlay : false;\n\n const isStatic = type === 'static';\n\n const appLinkParams = isStatic && ObjectHelper.isObject(props.appLink?.params) ?\n props.appLink?.params as HashObject :\n {};\n\n const [ hoverRef, isHovering ] = useHover<HTMLDivElement>();\n const [ hoverIntentRef, isHoveringIntentionally ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n function setHoverRefs(r: HTMLDivElement) {\n hoverRef.current = r;\n hoverIntentRef.current = r;\n }\n\n const showThumbnailPreviewVideo = isStatic && isHoveringIntentionally && canConsume && hoverToPlay;\n\n function canFavourite(): boolean {\n if (!isStatic)\n return;\n\n return !props.disableFavourite &&\n props.commonVideoProps.canFavourite?.(props.video) &&\n FavouriteHelper.showFavouriteButton(video, isHovering);\n }\n\n function getContainerClass(): string {\n let className = 'position-relative';\n\n className += (isStatic && props.appLink && canNavigate) ? ' cursor-pointer' : '';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` rounded overflow-hidden`;\n\n return className;\n }\n\n function getThumbnailClass(): string {\n let className = `overflow-hidden ${props.size === 'sm' ? 'rounded' : 'rounded-3'}`;\n\n if (props.imageClassName)\n className += ` ${props.imageClassName}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` ${styles.gradient}`;\n \n return className;\n }\n\n const eventAnalyticsOptions = isStatic ? {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n } : {};\n\n const showMask = isStatic && !!props.appLink && !props.hideMask && canNavigate;\n const tooltip = isStatic ?\n VideoHelper.getPrivacyReasoning(props.video, props.showSignIn) :\n '';\n\n const analyticsData = isStatic ? {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n } : {};\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={tooltip} spanHack spanHackClassName=''>\n <div className={getContainerClass()} ref={setHoverRefs}>\n {isStatic &&\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={props.size === 'sm' ? 'rounded' : 'rounded-3'}\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n }\n\n <VideoThumbnailActions\n video={video}\n checkMarkStatus={!isStatic && props.checkMarkStatus}\n setCheckMarkStatus={!isStatic && props.setCheckMarkStatus}\n setFavourite={isStatic && props.commonVideoProps.setFavourite}\n canFavourite={canFavourite}\n analyticsData={isStatic && props.analyticsData}\n analyticsOptions={isStatic && eventAnalyticsOptions}\n size={props.size}\n />\n\n <BaseImage\n data={VideoHelper.getThumbnail(video)}\n appLink={isStatic && canNavigate ? props.appLink : null}\n onClick={isStatic && canNavigate ? props.onClick : undefined}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n className={getThumbnailClass()}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n openInNewTab={props.openInNewTab}\n forcePageLoad={props.forcePageLoad}\n >\n {showMask && (\n <Mask type={MaskType.Video} size={props.size} alwaysShowIcon={alwaysShowIcon}/>\n )}\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n {/* overlay */}\n {textPosition === ThumbnailTextPosition.Overlay && <ThumbnailText {...props} />}\n \n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {isStatic && props.showOwner &&\n <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />\n }\n \n {!props.hideVideoTypeBadge && <VideoTypeBadge video={video} size={props.size} />}\n\n {isStatic &&\n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n size={props.size}\n />\n }\n </div>\n\n {/* bottom */}\n {!props.hideBottomBar &&\n <VideoThumbnailBottomBar video={video} />\n }\n \n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n newDurationStyle={props.newDurationStyle}\n size={props.size}\n />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={isStatic && props.shareId }\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={isStatic && canNavigate ? props.appLink : null}\n />\n }\n\n {textPosition === ThumbnailTextPosition.Below && <ThumbnailText {...props} />}\n </div>\n </Tooltip>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Audience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { ExpandableVideoThumbnail } from './expandable/ExpandableVideoThumbnail';\nimport { PopoutVideoThumbnail } from './popout/PopoutVideoThumbnail';\nimport { StaticVideoThumbnail } from './static/StaticVideoThumbnail';\n\ninterface BaseCommonVideoThumbnailProps {\n video: VideoTypes;\n imageOptions: ImageOptions;\n preload?: boolean;\n}\n\ninterface BasePlayableVideoThumbnailProps extends BaseCommonVideoThumbnailProps {\n appLink: Core.AppLink;\n onClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Location context required\n\n /**\n * TODO: Fix whatever this used to do in playlists\n */\n canRemovePrivateVideos?: boolean;\n showSignIn?: boolean;\n\n showOwner?: boolean;\n\n shareId?: string;\n\n commonVideoProps: CommonVideoProps;\n}\n\nexport interface ExpandableVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'expandable';\n newDurationStyle?: boolean;\n hovering: boolean;\n}\n\nexport interface PopoutVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'popout';\n hideDuration: boolean;\n extraClasses?: string;\n hideRating?: boolean;\n hideTitle?: boolean;\n showVideoGuidance: boolean;\n onClickRemove: () => void;\n removeButtonTooltip?: string;\n audience: Audience;\n}\n\ninterface BaseStaticVideoThumbnailProps {\n textPosition?: ThumbnailTextPosition;\n extraClasses?: string;\n imageClassName?: string;\n size: 'sm' | 'md';\n hideMask?: boolean;\n videoTypeBadgeSize?: 'sm' | 'std';\n hideDuration?: boolean;\n audience?: Audience;\n newDurationStyle?: boolean;\n hideRating?: boolean;\n hideVideoTypeBadge?: boolean;\n hideBottomBar?: boolean;\n alwaysShowIcon?: boolean;\n openInNewTab?: boolean;\n forcePageLoad?: boolean;\n}\n\nexport interface StaticVideoThumbnailProps extends BaseStaticVideoThumbnailProps, BasePlayableVideoThumbnailProps {\n type: 'static';\n disableFavourite?: boolean;\n}\n\n/**\n * If you need any of the following, you should be using static:\n * - Favourite button\n * - Applink to link to the video\n * - Hover to play\n * - Analytics data\n * - Showing the owner\n * - Showing sign in\n * \n * Cosmetic should just be for displaying a thumbnail that is not interacted with, or the <AppLink />\n * is outside of the thumbnail like in shares.\n * \n * - Sha\n */\nexport interface CosmeticVideoThumbnailProps extends BaseCommonVideoThumbnailProps, BaseStaticVideoThumbnailProps {\n type: 'cosmetic';\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n checkMarkStatus?: CheckMarkStatus;\n}\n\nexport type VideoThumbnailProps =\n ExpandableVideoThumbnailProps |\n PopoutVideoThumbnailProps |\n StaticVideoThumbnailProps |\n CosmeticVideoThumbnailProps;\n\nVideoThumbnail.defaultProps = {\n hideRating: true,\n size: 'md',\n showOwner: true\n};\n\nexport function VideoThumbnail(props: VideoThumbnailProps): JSX.Element {\n switch (props.type) {\n case 'static':\n return <StaticVideoThumbnail {...props} />;\n case 'cosmetic':\n // No hover to play for cosmetic use of VideoThumbnail\n return <StaticVideoThumbnail {...props} />;\n case 'expandable':\n // Expandable thumbnails show metadata on hover. Static display the duration and don't expand on hover\n return <ExpandableVideoThumbnail {...props} />;\n case 'popout':\n return <PopoutVideoThumbnail {...props} />;\n default:\n return;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BLOn55yc2.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/title-sub-text/title-sub-text.module.scss","../../../../libs/shared/src/components/title-sub-text/TitleSubText.tsx","../../../../libs/shared/src/images/svg/objects/HeartOutlineSvg.tsx","../../../../libs/shared/src/images/svg/objects/HeartSvg.tsx","../../../../libs/shared/src/utils/FavouriteHelpers.ts","../../../../libs/shared/src/components/favourite-button/favourite-button.module.scss","../../../../libs/shared/src/components/favourite-button/FavouriteButton.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/videos/VideoWatchProgressBar.tsx","../../../../libs/shared/src/components/thumbnails/bottom-bar/video-thumbnail-bottom-bar.module.scss","../../../../libs/shared/src/components/thumbnails/bottom-bar/VideoThumbnailBottomBar.tsx","../../../../libs/shared/src/components/svg-container/SvgContainer2.tsx","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/lite-owner-avatar.module.scss","../../../../libs/shared/src/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar.tsx","../../../../libs/shared/src/components/thumbnails/plugin-hover/plugin-hover.module.scss","../../../../libs/shared/src/components/thumbnails/plugin-hover/PluginHover.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/thumbnail-padlock.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-company/thumbnail-company-logo.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo.tsx","../../../../libs/shared/src/utils/NumberHelper.ts","../../../../libs/shared/src/utils/SeriesHelper.ts","../../../../libs/shared/src/components/video-sub-text/video-sub-text.module.scss","../../../../libs/shared/src/components/video-sub-text/VideoSubText.tsx","../../../../libs/shared/src/images/svg/objects/ClipSvg.tsx","../../../../libs/shared/src/images/svg/objects/InteractiveSvg.tsx","../../../../libs/shared/src/images/svg/objects/ResourcesSvg.tsx","../../../../libs/shared/src/components/type-badge/type-badge.module.scss","../../../../libs/shared/src/components/type-badge/TypeBadge.tsx","../../../../libs/shared/src/components/video-type-badge/VideoTypeBadge.tsx","../../../../libs/shared/src/context/player-context/components/global-player-consumer.module.scss","../../../../libs/shared/src/context/player-context/components/GlobalPlayerConsumer.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleSvg.tsx","../../../../libs/shared/src/components/thumbnails/video/expandable/expandable-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/expandable/ExpandableVideoThumbnail.tsx","../../../../libs/shared/src/context/VideoPreviewContext.tsx","../../../../libs/shared/src/hooks/UseHoverLogger.ts","../../../../libs/shared/src/components/hover-to-portal-container/hoverToPortalContainerUtil.ts","../../../../libs/shared/src/components/hover-to-portal-container/hover-to-portal-container.module.scss","../../../../libs/shared/src/components/hover-to-portal-container/HoverToPortalContainer.tsx","../../../../libs/shared/src/components/audience-label/AudienceLabel.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/video-thumbnail-badges.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-badges/VideoThumbnailBadges.tsx","../../../../libs/shared/src/components/video-list/components/restriction-padlock/RestrictionPadlock.tsx","../../../../libs/shared/src/components/video-title/video-title.module.scss","../../../../libs/shared/src/components/video-title/VideoTitle.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-text/thumbnail-text.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-text/ThumbnailText.tsx","../../../../libs/shared/src/components/video-guidance/tag/video-guidance-tag.module.scss","../../../../libs/shared/src/components/video-guidance/tag/VideoGuidanceTag.tsx","../../../../libs/shared/src/images/svg/objects/GraduationCapSvg.tsx","../../../../libs/shared/src/components/video-guidance/classroom-guide/ClassroomGuideTag.tsx","../../../../libs/shared/src/components/video-guidance/interactives/InteractivesTag.tsx","../../../../libs/shared/src/components/video-guidance/resources/ResourcesTag.tsx","../../../../libs/shared/src/components/video-list/components/video-guidance/VideoItemGuidance.tsx","../../../../libs/shared/src/components/thumbnails/remove-button/remove-video-button.module.scss","../../../../libs/shared/src/components/thumbnails/remove-button/RemoveVideoButton.tsx","../../../../libs/shared/src/components/thumbnails/video/popout/popout-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/popout/PopoutVideoThumbnail.tsx","../../../../libs/shared/src/images/svg/actions/PlayCircleFilledSvg.tsx","../../../../libs/shared/src/components/mask/mask.module.scss","../../../../libs/shared/src/components/mask/Mask.tsx","../../../../libs/shared/src/images/svg/status/TickSvg.tsx","../../../../libs/shared/src/components/check-mark-button/check-mark-button.module.scss","../../../../libs/shared/src/components/check-mark-button/CheckMarkButton.tsx","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/video-thumbnail-actions.module.scss","../../../../libs/shared/src/components/thumbnails/thumbnail-actions/VideoThumbnailActions.tsx","../../../../libs/shared/src/enums/ThumbnailTextPosition.ts","../../../../libs/shared/src/components/thumbnails/video/static/static-video-thumbnail.module.scss","../../../../libs/shared/src/components/thumbnails/video/static/StaticVideoThumbnail.tsx","../../../../libs/shared/src/components/thumbnails/video/VideoThumbnail.tsx"],"sourcesContent":[":local {\n .subText {\n font-size: calc(11 / 14) * 1em;\n \n &.sm {\n font-size: calc(8 / 14) * 1em;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from '../app-link/AppLink';\n\nimport styles from './title-sub-text.module.scss';\n\ntype TitleSubTextProps = React.PropsWithChildren<{\n title?: string,\n className?: string,\n ariaLabel?: string,\n appLink?: Core.AppLink,\n analyticsData?: HashObject,\n analyticsOptions?: AnalyticsOptions\n}>;\n\nexport function TitleSubText(props: TitleSubTextProps): JSX.Element {\n const className = `text-uppercase text-truncate mb-0 ${styles.subText} ${props.className}`;\n\n if (props.appLink) {\n return (\n <AppLink\n className={className}\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n title={props.title}\n ariaLabel={props.ariaLabel}\n >\n {props.children}\n </AppLink>\n );\n }\n\n return (\n <div\n className={className}\n title={props.title}\n aria-label={props.ariaLabel}\n >\n {props.children}\n </div>\n );\n}\n","import React from 'react';\n\nexport function HeartOutlineSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805m.812-10.7.001-.004.007-.022.03-.097a5.83 5.83 0 0 1 .744-1.463c.565-.798 1.428-1.532 2.72-1.532 2.03 0 3.516 1.72 3.516 3.866 0 1.445-.713 2.686-2.089 4.119-.944.984-2.151 2.01-3.579 3.224-.575.49-1.187 1.01-1.832 1.57-.645-.56-1.257-1.08-1.832-1.57-1.428-1.214-2.635-2.24-3.58-3.224C5.214 12.11 4.5 10.869 4.5 9.423c0-2.146 1.487-3.865 3.517-3.865 1.29 0 2.154.734 2.719 1.532a5.8 5.8 0 0 1 .774 1.56l.007.022v.004a.5.5 0 0 0 .965 0'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function HeartSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n fillOpacity={0.9}\n d='M11.67 19.376a.5.5 0 0 0 .66 0c.732-.64 1.435-1.239 2.1-1.805 1.453-1.235 2.722-2.314 3.703-3.335 1.443-1.504 2.367-2.984 2.367-4.812 0-2.588-1.83-4.866-4.517-4.866-1.736 0-2.865 1.008-3.535 1.954a7 7 0 0 0-.448.733 7 7 0 0 0-.448-.733c-.67-.946-1.8-1.954-3.535-1.954C5.33 4.558 3.5 6.836 3.5 9.424c0 1.828.924 3.308 2.367 4.812.98 1.02 2.25 2.1 3.703 3.335.665.566 1.368 1.165 2.1 1.805'\n />\n </svg>\n );\n}\n","import { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CurrentUser, User, Video, VideoTypes } from 'libs/shared/interfaces';\n\nimport { VideoHelper } from './VideoHelper';\n\nexport const FavouriteHelper = {\n\n /**\n * This helper is based on a *critical* assumption that the with statement\n * retrieving the favouritedBy collection uses a filter for the current user's id.\n * \n * The reason we're not passing the current user as an arg is that we would need to \n * drill the user object all the way down to low level componenets.\n * \n * @param object \n */\n isFavouritedByCurrentUser(object: HashObject): boolean {\n return !!(object?.favouritedBy?.data.length === 1);\n },\n\n /**\n * Determine whether the user has favourited the object\n * \n * @param object \n */\n isFavouritedByUser(object: HashObject, user: User): boolean {\n return !!(ArrayHelper.findWhere(object?.favouritedBy?.data, { id: user?.id }));\n },\n\n updateVideoState(video: VideoTypes, user: CurrentUser | User, shouldFavourite: boolean): VideoTypes {\n return {\n id: video.id,\n favouritedBy: {\n data: shouldFavourite ? [{ id: user.id } as User] : [],\n pagination: { limit: 25, cursors: { next: '', previous: '' } }\n }\n };\n },\n\n showFavouriteButton(video: Video, isHovering: boolean): boolean {\n if (!VideoHelper.getCanBeConsumed(video)?.canConsume)\n return false;\n\n if (isHovering)\n return true;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n if (FavouriteHelper.isFavouritedByCurrentUser(video))\n return true;\n\n return false;\n }\n};\n",":local {\n $badge-size: 1.875rem;\n\n %badges-size {\n width: $badge-size;\n height: $badge-size;\n }\n\n // This structure of this styling exactly matches favourite-button.scss from the favourite-plugin in player\n // When changing this please also change that - Sha\n .heart {\n display: none;\n }\n\n .favouriteButton {\n color: $dark;\n background-color: rgba($gray-200, 0.8);\n border-radius: 50%;\n @extend %badges-size;\n\n &:hover {\n color: $danger;\n\n .heartOutline {\n display: none;\n }\n\n .heart {\n opacity: 0.8;\n display: inline-block;\n }\n }\n }\n\n .favourited {\n color: $danger;\n background-color: rgba($gray-200, 0.8);\n @extend %badges-size;\n\n .heartOutline {\n display: none;\n }\n\n .heart {\n display: inline-block;\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { HeartOutlineSvg } from 'libs/shared/images/svg/objects/HeartOutlineSvg';\nimport { HeartSvg } from 'libs/shared/images/svg/objects/HeartSvg';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './favourite-button.module.scss';\n\nconst namespace = 'shared.favouriteButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouriteButtonProps {\n video: VideoTypes;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n preventFocus?: boolean;\n}\n\nexport function FavouriteButton(props: FavouriteButtonProps): JSX.Element {\n const alerts = useAlerts();\n\n const initialState = FavouriteHelper.isFavouritedByCurrentUser(props.video);\n\n // Use local state so that changes are reflected immediately.\n const [ isFavourite, setIsFavourite ] = React.useState(initialState);\n\n React.useEffect(() => {\n setIsFavourite(initialState);\n }, [initialState]);\n\n const flexClasses = 'd-flex align-items-center justify-content-center';\n let className = `${flexClasses} cursor-pointer ${styles.favouriteButton} ${isFavourite ? styles.favourited : ''}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n function onClick(): void {\n const shouldFavourite = !isFavourite;\n\n function onError(): void {\n function getErrorPhraseKey(): string {\n if (VideoHelper.isClip(props.video))\n return shouldFavourite ? 'favouriteClipError' : 'unfavouriteClipError';\n\n if (VideoHelper.isInteractive(props.video))\n return shouldFavourite ? 'favouriteInteractiveError' : 'unfavouriteInteractiveError';\n\n return shouldFavourite ? 'favouriteVideoError' : 'unfavouriteVideoError';\n }\n\n alerts.error(getPhrase(getErrorPhraseKey()));\n setIsFavourite(!shouldFavourite);\n }\n\n setIsFavourite(shouldFavourite);\n props.setFavourite(props.video, shouldFavourite, null, onError, props.analyticsData, props.analyticsOptions);\n }\n\n if (!FunctionHelper.isFunction(props.setFavourite) || !FunctionHelper.isFunction(props.canFavourite))\n return <></>;\n\n // Don't render until we know the state of isFavourite\n if (!props.canFavourite(props.video))\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} tabIndex={props.preventFocus ? -1 : undefined}>\n {/* We have the two svgs because they get swapped out on hover by the styles */}\n <SvgContainer\n svg={HeartSvg}\n className={`svg-container ${styles.heart}`}\n />\n <SvgContainer\n svg={HeartOutlineSvg}\n className={`svg-container ${styles.heartOutline}`}\n />\n </DivButton>\n );\n}\n","import * as React from 'react';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoWatchProgressBarProps {\n video: Video;\n}\n\nexport function VideoWatchProgressBar(props: VideoWatchProgressBarProps): JSX.Element {\n const progress = VideoHelper.getVideoProgress(props.video);\n\n const watchPercentage = progress && props.video.duration\n && progress / props.video.duration * 100000;\n\n if (!watchPercentage)\n return <></>;\n\n return <div className='bg-primary h-100' style={{ width: `${watchPercentage}%` }} />;\n}\n",":local {\n .bottomBar {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2;\n height: $cv-video-bottom-bar-height;\n }\n}","import React from 'react';\n\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { VideoWatchProgressBar } from './videos/VideoWatchProgressBar';\n\nimport styles from './video-thumbnail-bottom-bar.module.scss';\n\ninterface VideoThumbnailBottomBarProps {\n video: VideoTypes;\n}\n\nexport function VideoThumbnailBottomBar(props: VideoThumbnailBottomBarProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video)) {\n return <></>;\n }\n\n return (\n <div className={styles.bottomBar}>\n <VideoWatchProgressBar video={props.video} />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport { SvgContainerSize } from './SvgContainer'; // TODO: Move this enum in here\n\nconst DEFAULT_CLASS_NAME = 'd-inline-block svg-container';\nconst DEFAULT_TAG_NAME = 'span';\n\ninterface SvgContainerProps2 {\n size?: SvgContainerSize;\n className?: string;\n tagName?: React.ElementType;\n onClick?: (...args: any[]) => void;\n title?: string;\n tooltipPlacement?: Placement;\n}\n\n/**\n * @deprecated please use SvgContainer instead. This component will be removed in the future\n * whenever someone gets around to it (that could be you!)\n */\nexport function SvgContainer2(props: React.PropsWithChildren<SvgContainerProps2>): React.ReactElement {\n const {\n children,\n className = DEFAULT_CLASS_NAME,\n tagName = DEFAULT_TAG_NAME,\n size = SvgContainerSize.Standard,\n onClick,\n title,\n tooltipPlacement = 'right'\n } = props;\n\n const Container = tagName;\n\n const containerProps = {\n className: `${className} svg-container ${size}`,\n onClick: FunctionHelper.isFunction(onClick) ? onClick : null\n };\n\n if (!title)\n return <Container {...containerProps}>{children}</Container>;\n\n return (\n <Tooltip title={title} placement={tooltipPlacement}>\n <Container {...containerProps}>\n {children}\n </Container>\n </Tooltip>\n );\n}\n",":local {\n $avatar-size: 1.875rem;\n $avatar-size-sm: 1.5rem;\n\n .std {\n min-width: $avatar-size;\n height: $avatar-size;\n }\n \n .sm {\n min-width: $avatar-size-sm;\n width: $avatar-size-sm;\n height: $avatar-size-sm;\n }\n\n .stdIcon {\n transform: translate(-50%, -50%);\n // ClickView logo looks better when positioned slightly further to the right\n left: 60%;\n top: 50%;\n position: absolute;\n width: 1.1rem;\n height: 1.1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .smIcon {\n top: -0.2rem;\n left: 0.5rem;\n position: absolute;\n width: 0.8rem;\n height: 0.8rem;\n }\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { ClickViewLogoMark } from 'libs/shared/components/svgs/clickview-logo/ClickViewLogo';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './lite-owner-avatar.module.scss';\n\ninterface LiteOwnerAvatarProps {\n video: VideoTypes;\n imageCdnUrl: string;\n size?: VideoItemSize;\n}\n\nexport function LiteOwnerAvatar(props: LiteOwnerAvatarProps): JSX.Element {\n if (!VideoHelper.isInteractive(props.video) && !VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._liteOwner && !props.video._isClickViewCurated?.value)\n return <></>;\n\n if (props.video._isClickViewCurated?.value) {\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1 rounded-circle position-relative bg-white`}>\n <SvgContainer2 className={props.size === 'sm' ? styles.smIcon : styles.stdIcon}>\n <ClickViewLogoMark />\n </SvgContainer2>\n </div>\n );\n }\n\n return (\n <div className={`${props.size === 'sm' ? styles.sm : styles.std} me-1`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.video._liteOwner.name, props.video._liteOwner.surname)}\n imageUrl={props.video._liteOwner.avatar?.url}\n />\n </div>\n );\n}\n",":local {\n .pluginHover {\n z-index: 6;\n\n &:hover {\n opacity: 1!important;\n background-color: rgba(0,0,0,0.5);\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './plugin-hover.module.scss';\n\nconst namespace = 'shared.pluginHover';\n\ninterface PluginHoverProps {\n isPlugin: boolean;\n isPluginPopup: boolean;\n className?: string;\n onClick?: () => void;\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function PluginHover(props: PluginHoverProps): JSX.Element {\n if (!props.isPlugin || props.isPluginPopup)\n return <></>;\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n onClick={props.onClick}\n className={`\n position-absolute top-0 start-0 end-0 bottom-0 opacity-0 cursor-pointer\n ${styles.pluginHover}\n ${props.className ? props.className : ''}\n `}\n >\n <span className='position-absolute top-50 start-50 translate-middle text-nowrap h4 text-white'>\n <Text namespace={namespace} phrase='embed' />\n </span>\n </AppLink>\n );\n}\n",":local {\n .padlock {\n color: $dark;\n border-radius: 50%;\n width: 2rem;\n height: 2rem;\n opacity: 0.8;\n \n &.sm {\n width: $cv-svg-size;\n height: $cv-svg-size;\n }\n }\n}","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\n\nimport styles from './thumbnail-padlock.module.scss';\n\ninterface ThumbnailPadlockProps {\n size?: VideoItemSize;\n}\n\nexport function ThumbnailPadlock(props: ThumbnailPadlockProps): JSX.Element {\n const svgSize = props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard;\n\n return (\n <div className={`${styles.padlock} ${props.size === 'sm' ? styles.sm : ''} bg-white cursor-default d-flex align-items-center justify-content-center`}>\n <SvgContainer svg={LockSvg} size={svgSize} />\n </div>\n );\n}\n",":local {\n $size: 1.875rem;\n $size-sm: 1.5rem;\n\n .logo {\n width: $size;\n height: $size;\n border-radius: 50%;\n overflow: hidden;\n background-size: contain;\n background-position: center;\n\n &.sm {\n width: $size-sm;\n height: $size-sm;\n }\n }\n}","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './thumbnail-company-logo.module.scss';\n\ninterface ThumbnailCompanyLogoProps {\n companyLogoFallbackUrl: string;\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nThumbnailCompanyLogo.defaultProps = {\n size: 'md'\n};\n\nexport function ThumbnailCompanyLogo(props: ThumbnailCompanyLogoProps): JSX.Element {\n if (!VideoHelper.isVideo(props.video) || !props.companyLogoFallbackUrl)\n return <></>;\n\n const company = props.video.productionCompanies?.data?.[0];\n const url = ImageHelper.createUrl(company?.logo?.url ?? props.companyLogoFallbackUrl, { size: ImageSize.Small });\n const logoFallbackBgClassName = getBgColorClass(company.name, BG_COLOUR_CLASS_NAMES);\n \n if (!url)\n return <></>;\n\n return (\n <div>\n <Tooltip\n title={company?.name}\n spanHack\n >\n <div\n className={`${styles.logo} ${props.size === 'sm' ? styles.sm : ''} ${!company?.metadata?.colour && logoFallbackBgClassName}`}\n style={{\n backgroundImage: `url(${url})`,\n backgroundColor: company?.metadata?.colour\n }}\n />\n </Tooltip>\n </div>\n );\n}\n","export const NumberHelper = {\n padNumber(num: number, padLength: number): string {\n let numberString = num.toString();\n\n if (numberString.length >= padLength)\n return numberString;\n\n padLength = padLength - numberString.length;\n\n while (padLength > 0) {\n numberString = '0' + numberString;\n padLength--;\n }\n return numberString;\n }\n};\n","import { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Rating, Series } from 'libs/shared/interfaces';\n\nimport { NumberHelper } from './NumberHelper';\n\nexport const SeriesHelper = {\n isSeries(obj: BaseObject): obj is Series {\n return obj?.typeId === MasterType.Series;\n },\n\n buildSeriesSeasonEpisodeText(seriesName: string, season?: number, episode?: number): string {\n if (!seriesName)\n return '';\n\n if (!season || !episode)\n return seriesName.toUpperCase();\n\n const seasonNum = NumberHelper.padNumber(season, 2);\n const episodeNum = NumberHelper.padNumber(episode, 2);\n\n return `${seriesName.toUpperCase()} S${seasonNum} • E${episodeNum}`;\n },\n\n getRating(series: Series): Rating {\n return series._rating?.value;\n }\n};\n",":local {\n .appLink {\n color: inherit;\n\n &:hover {\n .hoverUnderline {\n text-decoration: underline;\n }\n }\n }\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, UserAction } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { Video } from 'libs/shared/interfaces';\nimport { NumberHelper } from 'libs/shared/utils/NumberHelper';\nimport { SeriesHelper } from 'libs/shared/utils/SeriesHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TitleSubText } from '../title-sub-text/TitleSubText';\n\nconst namespace = 'shared.videoSubText';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './video-sub-text.module.scss';\n\nexport type VideoSubTextType = 'series' | 'productionCompany' | 'none';\n\ninterface SeriesLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n withSeriesTitle?: boolean;\n size?: 'sm' | 'lg';\n}\n\nexport function SeasonEpisode(props: Omit<SeriesLinkProps, 'analyticsOptions' | 'analyticsData'>): JSX.Element {\n const { video } = props;\n const { season } = video;\n\n if (!video.episodeNumber || !season)\n return <></>;\n\n const seasonNumber = NumberHelper.padNumber(season.number, 2);\n const episodeNumber = NumberHelper.padNumber(video.episodeNumber, 2);\n\n /* \\u2022 is the unicode number for • */\n return (\n <span className={`d-inline-block ${props.appLink ? styles.hoverUnderline : ''}`}>\n {props.withSeriesTitle && <> </>}\n {!!seasonNumber && `S${seasonNumber} \\u2022 `}\n E{episodeNumber}\n </span>\n );\n}\n\nfunction ReleaseDate(props: SeriesLinkProps): JSX.Element {\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if (!releaseDate)\n return <></>;\n\n if (VideoHelper.hasSeries(props.video))\n return <>{` \\u2022 ${releaseDate}`}</>;\n\n return <>{releaseDate}</>;\n}\n\nfunction SeriesLink(props: SeriesLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const series = video?.series;\n const releaseDate = VideoHelper.getReleaseDate(props.video);\n\n if ((!series?.id) && !releaseDate)\n return <></>;\n\n const seriesAppLink: Core.AppLink = series?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ series.id, TextHelper.slugify(series.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: series?.id,\n name: series?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Series,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n const seriesTitle = SeriesHelper.buildSeriesSeasonEpisodeText(\n series?.name,\n video.season?.number,\n video.episodeNumber\n );\n\n return (\n <TitleSubText\n appLink={seriesAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={seriesTitle}\n ariaLabel={`${getPhrase('ariaSeries')} ${seriesTitle}`}\n >\n {series?.name && series.name}\n <SeasonEpisode {...props} withSeriesTitle />\n <ReleaseDate {...props} />\n </TitleSubText>\n );\n}\n\ninterface ProductionCompanyLinkProps {\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nfunction ProductionCompanyLink(props: ProductionCompanyLinkProps): JSX.Element {\n const { appLink, video, className = '' } = props;\n\n const productionCompany = video?.productionCompanies?.data?.[0];\n\n if (!productionCompany?.id)\n return <></>;\n\n const companyAppLink: Core.AppLink = productionCompany?.id && appLink && {\n ...appLink,\n args: appLink.args ? appLink.args : [ productionCompany.id, TextHelper.slugify(productionCompany.name) ]\n };\n\n const analyticsData = { ...props.analyticsData,\n id: productionCompany?.id,\n name: productionCompany?.name,\n videoId: video?.id,\n videoName: video?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Company,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Title\n };\n\n return (\n <TitleSubText\n appLink={companyAppLink}\n className={`d-block ${styles.appLink} ${className}`}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={productionCompany.name}\n ariaLabel={`${getPhrase('ariaCompany')} ${productionCompany.name}`}\n >\n {productionCompany.name}\n </TitleSubText>\n );\n}\n\ninterface VideoSubTextProps {\n type: VideoSubTextType;\n video: Video;\n appLink?: Core.AppLink;\n className?: string;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Required as `location` needs to be supplied\n size?: 'sm' | 'lg';\n}\n\nexport function VideoSubText(props: VideoSubTextProps): JSX.Element {\n const { type = 'series' } = props;\n\n if (type === 'none')\n return <></>;\n\n if (type === 'series')\n return <SeriesLink {...props} />;\n\n return <ProductionCompanyLink {...props} />;\n}\n\n","import React from 'react';\n\nexport function ClipSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M14.893 16.357a2.5 2.5 0 0 1 1.806-1.354 2.506 2.506 0 0 1 2.902 2.042 2.516 2.516 0 0 1-2.032 2.916 2.5 2.5 0 0 1-2.74-1.494l-2.603-5.208-2.57 5.138a2.504 2.504 0 0 1-2.769 1.564 2.516 2.516 0 0 1-2.031-2.916 2.506 2.506 0 0 1 2.901-2.042c.81.144 1.46.663 1.803 1.348l2.107-4.212-3.703-7.41a.504.504 0 0 1 .222-.675.5.5 0 0 1 .672.223l3.369 6.743 3.372-6.743a.5.5 0 0 1 .671-.223.504.504 0 0 1 .223.674l-3.707 7.412zm-9.053.863a1.51 1.51 0 0 0 1.221 1.752 1.505 1.505 0 0 0 1.743-1.227 1.51 1.51 0 0 0-1.22-1.752A1.505 1.505 0 0 0 5.84 17.22m11.555 1.752a1.51 1.51 0 0 0 1.221-1.752 1.505 1.505 0 0 0-1.743-1.227 1.51 1.51 0 0 0-1.22 1.752 1.505 1.505 0 0 0 1.742 1.227'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function InteractiveSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M11.91 4.025c-3.308 0-6 2.692-6 6 0 1.923.916 3.716 2.462 4.846v3.77c0 .763.621 1.384 1.385 1.384h4.308c.763 0 1.384-.62 1.384-1.384v-3.77a6 6 0 0 0 2.462-4.846c0-3.308-2.692-6-6-6m2.616 12.77v.615h-5.23v-.615zm-4.77 2.307a.46.46 0 0 1-.46-.461v-.308h5.23v.308a.46.46 0 0 1-.461.461zm4.77-4.471v1.24h-5.23v-1.24a.46.46 0 0 0-.205-.384 5.07 5.07 0 0 1-2.257-4.222c0-2.8 2.277-5.077 5.077-5.077s5.077 2.278 5.077 5.077a5.07 5.07 0 0 1-2.257 4.222.46.46 0 0 0-.205.384m-2.396-2.616a.56.56 0 0 0 .107-.348v-.068q.004-.237.076-.402a1 1 0 0 1 .235-.317q.165-.153.454-.35.462-.316.757-.724.294-.41.295-.97 0-.591-.283-.993a1.8 1.8 0 0 0-.76-.61 2.6 2.6 0 0 0-1.05-.208q-.629 0-1.151.279-.525.277-.78.825a1.2 1.2 0 0 0-.12.522.44.44 0 0 0 .105.303q.105.118.3.118.162 0 .271-.091a.5.5 0 0 0 .157-.247q.162-.518.471-.704.309-.187.718-.187.343 0 .62.119.28.118.443.339.164.22.164.53 0 .27-.104.467-.106.195-.28.35a5 5 0 0 1-.391.305q-.281.195-.516.419a1.9 1.9 0 0 0-.378.498 1.3 1.3 0 0 0-.143.613v.193q0 .213.114.346.114.134.338.133.224 0 .33-.14m.088 2.081a.6.6 0 0 0 .17-.426.6.6 0 0 0-.17-.428.57.57 0 0 0-.424-.177q-.242 0-.416.177a.59.59 0 0 0-.174.428.6.6 0 0 0 .174.426q.174.18.416.18.252 0 .424-.18'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nexport function ResourcesSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.06 4c.519 0 .94.479.94 1.075v13.85c0 .594-.419 1.075-.94 1.075H5.94c-.519 0-.94-.479-.94-1.075V5.075C5 4.48 5.419 4 5.94 4zM9.256 5H5.882v.184l-.001.1v.418l-.001.175-.001 1.113v1.429l-.001.314v2.024l-.001.352-.001 3.162v.335l-.001 4.386h.105l.08.001h.36l.157.001h.571l.221.001h.741l.27.001h1.174l.313.001h1.63l.332.001 2.61.001h.305l3.362.001h.012v-.184l.001-.1v-.418l.001-.175.001-1.113v-1.429l.001-.314v-2.024l.001-.352.001-3.162v-.335l.001-4.374v-.012h-.105l-.08-.001h-.36l-.157-.001h-.571l-.221-.001h-.741l-.27-.001h-1.174l-.313-.001h-1.63l-.332-.001-2.61-.001zm1.438 8c.238 0 .431.224.431.5s-.193.5-.431.5H8.056c-.238 0-.431-.224-.431-.5s.193-.5.431-.5zm5.198-3c.267 0 .483.224.483.5s-.216.5-.483.5H8.108a.49.49 0 0 1-.483-.5c0-.276.216-.5.483-.5zm0-3c.267 0 .483.224.483.5s-.216.5-.483.5H8.108a.49.49 0 0 1-.483-.5c0-.276.216-.5.483-.5z'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n $badge-size: 1.875rem;\n $badge-size-sm: 1.5rem;\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .draft {\n background-color: $gray-700;\n }\n\n .badge {\n display: flex;\n align-items: center;\n min-width: $badge-size;\n width: $badge-size;\n height: $badge-size;\n transition: width .3s;\n overflow: hidden;\n position: relative;\n\n .svg {\n min-width: $cv-svg-size;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n\n svg {\n vertical-align: top;\n }\n }\n\n .text {\n display: none;\n line-height: $badge-size;\n }\n\n &.sm {\n min-width: $badge-size-sm;\n width: $badge-size-sm;\n height: $badge-size-sm;\n\n .svg {\n min-width: $cv-svg-size-sm;\n }\n\n .text {\n font-size: 80%;\n line-height: $badge-size-sm;\n }\n }\n\n &:hover {\n width: 100%;\n padding-right: map-get($spacers, 2);\n\n .text {\n display: block;\n }\n\n .svg {\n margin-left: 0.2rem;\n position: relative;\n left: 0.75rem;\n }\n\n &.sm {\n .svg {\n left: 0.55rem;\n }\n }\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ClipSvg } from 'libs/shared/images/svg/objects/ClipSvg';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\n\nimport styles from './type-badge.module.scss';\n\nconst namespace = 'shared.typeBadge';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getText(typeId: MasterType): string {\n switch (typeId) {\n case MasterType.Clip:\n return getPhrase('clip');\n case MasterType.Interactive:\n return getPhrase('interactive');\n case MasterType.Resource:\n return getPhrase('resource');\n default:\n return '';\n }\n}\n\nfunction getIcon(typeId: MasterType) {\n switch (typeId) {\n case MasterType.Clip:\n return ClipSvg;\n case MasterType.Interactive:\n return InteractiveSvg;\n case MasterType.Resource:\n return ResourcesSvg;\n default:\n return null;\n }\n}\n\nfunction getColourClass(typeId: MasterType, status: CurationStatus): string {\n switch (typeId) {\n case MasterType.Clip:\n return 'bg-ultramarine';\n case MasterType.Interactive:\n return status === CurationStatus.Draft ? styles.draft : 'bg-green';\n case MasterType.Resource:\n return 'bg-indigo';\n default:\n return '';\n }\n}\n\ninterface TypeBadgeProps {\n typeId: MasterType;\n status?: CurationStatus;\n size?: 'sm' | 'md';\n inContainer?: boolean;\n}\n\nTypeBadge.default = {\n size: 'md'\n};\n\nexport function TypeBadge(props: TypeBadgeProps): JSX.Element {\n const baseClasses = `${styles.badge} rounded-pill text-white ps-0 ${props.size === 'sm' ? styles.sm : ''}`;\n\n return (\n <div className={props.inContainer ? '' : styles.topLeftContainer}>\n <div className={`${baseClasses} ${getColourClass(props.typeId, props.status)}`}>\n <SvgContainer\n className={`svg-container d-block ${styles.svg}`}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n svg={getIcon(props.typeId)}\n />\n <span className={styles.text}>\n {getText(props.typeId)}\n </span>\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces/VideoTypes';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { TypeBadge } from '../type-badge/TypeBadge';\n\ninterface VideoTypeBadgeProps {\n video: VideoTypes;\n size?: VideoItemSize;\n}\n\nVideoTypeBadge.default = {\n size: 'md'\n};\n\nexport function VideoTypeBadge(props: VideoTypeBadgeProps): JSX.Element {\n if (VideoHelper.isClip(props.video))\n return <TypeBadge typeId={MasterType.Clip} size={props.size} inContainer />;\n\n if (VideoHelper.isInteractive(props.video))\n return (\n <TypeBadge\n typeId={MasterType.Interactive}\n status={props.video.status}\n size={props.size}\n inContainer\n />\n );\n\n return <></>;\n}\n",":local {\n .hoverContainer {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 6;\n opacity: 0;\n transition: opacity .5s;\n }\n\n .hovering {\n opacity: 1;\n }\n\n .theatreModeOn {\n > :global(.cv-theatre-mode-video-container) {\n width: 100%;\n height: 100%;\n aspect-ratio: 16 / 9;\n max-height: min(80vh, calc(100vw * 9 / 16));\n\n // Fix in Safari the child element will overflow - force child's height to be limited by parent\n display: flex;\n flex-direction: column;\n }\n }\n}","import React from 'react';\nimport { OutPortal } from 'react-reverse-portal';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PlayerInitializationData } from 'libs/shared/context/player-context/interfaces/PlayerContextAction';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport styles from './global-player-consumer.module.scss';\n\ninterface GlobalPlayerConsumerOptions extends PlayerInitializationData {\n location?: 'popout-video' | 'play-page';\n}\n\nexport function GlobalPlayerConsumer(props: GlobalPlayerConsumerOptions): JSX.Element {\n const playerContext = usePlayerContext();\n\n playerContext.useInitialize?.(props);\n\n if (!playerContext.hasProvider)\n return <></>;\n\n if (playerContext.mode === 'picture-in-picture')\n return <></>;\n\n if (props.mode === 'hover' && playerContext.isOnPlayPage)\n return <></>;\n \n if (props.location === 'play-page') {\n // we don't want to add theatreModeOn style for interactive preview\n const theatreMode = playerContext.defaultDisplayMode === 'theatre' && props.objectTypeId !== MasterType.Interactive;\n return (\n <div className={theatreMode ? `w-100 h-100 ${styles.theatreModeOn}` : ''}>\n <OutPortal node={playerContext.portalNode} />\n </div>\n );\n }\n\n if (playerContext.mode !== 'hover')\n return <></>;\n\n /**\n * When hovering, we don't want to show the player until the video has started playing.\n */\n const shouldShow = playerContext.started;\n\n let rounding = 'rounded-3';\n if (props.location === 'popout-video')\n rounding = 'rounded-top-3';\n\n const className = `${styles.hoverContainer} ${shouldShow ? styles.hovering : ''} ${rounding} overflow-hidden`;\n\n /**\n * If the user clicks before GlobalPlayerView calls setPlayerMode('hover') to bind the click handler,\n * we still need to persist the player reference in the PlayerContext. Otherwise it will be set to null. - Sha\n */\n function onClick(): void {\n if (!props.appLink)\n return;\n\n playerContext.setPersist();\n }\n\n return (\n <AppLink className={className} onClick={onClick} appLink={props.appLink}>\n <OutPortal node={playerContext.portalNode} />\n </AppLink>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12m23 0c0-6.075-4.925-11-11-11S1 5.925 1 12s4.925 11 11 11 11-4.925 11-11M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","@import '~styles/utils/include-media';\n:local {\n $video-progress-height: 0.25rem;\n $interactive-and-clip-progress-height: 1.25rem;\n $overlay-index: 2;\n $overlay-actions-index: 3;\n\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: $overlay-index;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .topRightContainer {\n position: absolute;\n top: 0;\n right: 0;\n\n padding-top: map-get($spacers, 2);\n padding-right: map-get($spacers, 2);\n z-index: $overlay-actions-index;\n\n transform: translate3d(0,0,0);\n }\n\n .overlay {\n color: inherit;\n line-height: 1.2;\n position: absolute;\n bottom: 0;\n left: 0;\n\n padding: map-get($spacers, 2);\n padding-top: 0;\n width: 100%;\n\n @include media(\"<=sm\") {\n padding-bottom: map-get($spacers, 1);\n }\n\n &.downScale {\n transform: scale(0.9);\n\n margin-left: -1rem;\n margin-bottom: -0.2rem;\n }\n }\n\n .title {\n @include media(\"<=sm\") {\n margin-bottom: 0 !important;\n }\n }\n\n .gradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.50) 05%,\n rgba(0, 0, 0, 0.40) 10%,\n rgba(0, 0, 0, 0.20) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0.00) 80%\n );\n }\n }\n\n .playIcon {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 4;\n color: $white;\n transform: translate3D(-50%, -50%, 0);\n transition: opacity 100ms ease-in-out;\n width: 2.75rem;\n height: 2.75rem;\n }\n\n .videoProgress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: $video-progress-height;\n }\n\n .videoProgress + .badgeContainer {\n bottom: map-get($spacers, 1) + $video-progress-height;\n }\n\n .clipProgress,\n .interactiveProgress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: $navy;\n height: $interactive-and-clip-progress-height;\n opacity: .9\n }\n\n .clipProgress + .badgeContainer,\n .interactiveProgress + .badgeContainer {\n bottom: map-get($spacers, 1) + $interactive-and-clip-progress-height;\n }\n}\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { ExpandableVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\nimport { CloseCaptionBadgeSvg } from 'libs/shared/images/svg/status/CloseCaptionBadgeSvg';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './expandable-video-thumbnail.module.scss';\n\nfunction getTitleClass(hovering: boolean): string {\n let className = 'mb-1';\n\n if (hovering) {\n className += styles.downScale;\n }\n \n return className;\n}\n\nexport function ExpandableVideoThumbnail(props: ExpandableVideoThumbnailProps): JSX.Element {\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(props.video);\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(props.appLink?.params) ? props.appLink?.params as HashObject : {};\n\n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n };\n\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, props.hovering);\n const isVideo = VideoHelper.isVideo(props.video);\n\n const rating = VideoHelper.getRating(props.video);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n\n const showThumbnailPreviewVideo = isThumbnailHovering && canConsume && hoverToPlay;\n\n const analyticsData = {\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <div className='position-relative rounded-3 overflow-hidden' ref={thumbnailHoverRef}>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className='rounded-3'\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n\n {showFavouriteButton &&\n <div className={styles.topRightContainer}>\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n />\n </div>\n }\n {/* top right */}\n {!canNavigate && (\n <div className={styles.topRightContainer}>\n <ThumbnailPadlock />\n </div>\n )}\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={props.video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n\n <VideoTypeBadge video={props.video} />\n\n <ThumbnailCompanyLogo\n video={props.video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(props.video)}\n />\n </div>\n\n <BaseImage\n data={VideoHelper.getThumbnail(props.video)}\n appLink={canNavigate ? props.appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={props.imageOptions}\n preload={props.preload}\n className={styles.gradient}\n alt={('series' in props.video && props.video.series?.name ? `${props.video.series.name}: ` : '') + props.video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n >\n {!!(props.hovering && canNavigate) && (\n <SvgContainer className={styles.playIcon} svg={PlayCircleSvg} />\n )}\n\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n <div className={styles.overlay}>\n <div className={`${getTitleClass(props.hovering)} ${styles.title}`}>\n {isVideo && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-shadow clamp-1'\n video={props.video}\n appLink={null}\n analyticsOptions={null}\n />\n )}\n\n <span className='h6 text-reset text-shadow clamp-1'>\n {VideoHelper.getTitle(props.video)}\n </span>\n </div>\n\n <VideoThumbnailBottomBar video={props.video} />\n\n {props.hovering && (\n <BadgeListContainer className='mt-1'>\n {VideoHelper.isVideo(props.video) && (\n <>\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n {props.video.hasSubtitle && (\n <span className='badge p-0'>\n <SvgContainer svg={CloseCaptionBadgeSvg} />\n </span>\n )}\n <Badge\n type={BadgeType.Interactive}\n data={props.video.hasInteractives}\n />\n <Badge\n type={BadgeType.DurationExact}\n data={VideoHelper.getDuration(props.video)}\n />\n </>\n )}\n </BadgeListContainer>\n )}\n </div>\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={canNavigate ? props.appLink : null}\n />\n }\n </div>\n </Tooltip>\n );\n}\n","import React from 'react';\nimport { HtmlPortalNode, OutPortal } from 'react-reverse-portal';\n\ninterface VideoPreviewContext {\n setPreviewContentNode?: (node: HtmlPortalNode) => void;\n}\n\nexport const VideoPreviewContext = React.createContext<VideoPreviewContext>({});\n\nexport const VideoPreviewContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ node, setNode ] = React.useState<HtmlPortalNode>(null);\n\n return (\n <VideoPreviewContext.Provider value={{ setPreviewContentNode: setNode }}>\n {node && (\n <OutPortal node={node}/>\n )}\n {props.children}\n </VideoPreviewContext.Provider>\n );\n};\n","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nexport function useHoverLogger(\n isHovering: boolean,\n analyticsData: HashObject,\n analyticsOptions: AnalyticsOptions\n): void {\n const [ hasHovered, setHasHovered ] = React.useState(isHovering);\n const timeStartedHovering = React.useRef<Date>(isHovering ? new Date() : null);\n\n React.useEffect(() => {\n if (!analyticsData || !analyticsOptions)\n return;\n\n if (!analyticsOptions.entity || !analyticsData.location)\n return;\n\n if (isHovering) {\n if (!hasHovered)\n setHasHovered(true);\n\n timeStartedHovering.current = new Date();\n\n AnalyticsHelper.logUserAction(analyticsData, {\n ...analyticsOptions,\n actionType: UserAction.Hover\n });\n } else {\n if (!hasHovered)\n return;\n\n const timeHoveredInMilliseconds = new Date().getTime() - timeStartedHovering.current.getTime();\n timeStartedHovering.current = null;\n\n AnalyticsHelper.logUserAction({\n ...analyticsData,\n timeHoveredInMilliseconds,\n timeHoveredInSeconds: timeHoveredInMilliseconds / 1000\n }, {\n ...analyticsOptions,\n actionType: UserAction.Unhover\n });\n }\n }, [isHovering]);\n}\n","import { HashObject } from 'libs/common/react/interfaces';\n\nconst EDGE_THRESHOLD = 8; // in px\nconst DEFAULT_SCALE = 1.2; // if no fixedWidth provided\n\nenum TransformOrigin {\n Left = '8px',\n Right = 'calc(100% - 8px)',\n Center = 'center'\n}\n\ninterface ParentRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type HoverPositionConfig = {\n width: number,\n height: number,\n top: number,\n left: number,\n transformOrigin: TransformOrigin,\n position: string,\n originalWidth: number,\n originalHeight: number\n};\n\nexport const calculatePosition = (\n parentDOMRect: ParentRect,\n fixedWith?: number,\n minWidth?: number,\n scale: number = DEFAULT_SCALE\n): HoverPositionConfig | HashObject => {\n const { x, y, width, height } = parentDOMRect;\n \n const contentReferenceEle = document.getElementById('content-width-reference');\n if (!contentReferenceEle) return {};\n\n let newX: number;\n\n let previewWidth = fixedWith || width * scale;\n let previewHeight = fixedWith ? fixedWith * (height / width) : height * scale;\n\n let realScale = fixedWith ? previewWidth / width : scale;\n newX = x - (previewWidth - width) / 2 ;\n\n if (previewWidth < minWidth) {\n newX = newX - (minWidth - previewWidth) / 2;\n previewWidth = minWidth;\n realScale = previewWidth / width;\n previewHeight = height * realScale;\n }\n\n const newY = y - (previewHeight - height) / 2 + window.scrollY;\n let left = newX;\n let transformOrigin = TransformOrigin.Center;\n // too close to the left\n if (newX - contentReferenceEle.offsetLeft < EDGE_THRESHOLD) {\n left = x - EDGE_THRESHOLD / 2;\n transformOrigin = TransformOrigin.Left;\n }\n // too close to the right\n if (contentReferenceEle.offsetWidth + contentReferenceEle.offsetLeft - (newX + previewWidth) < EDGE_THRESHOLD) {\n left = fixedWith ? x + width - fixedWith : x - width * (realScale - 1) + EDGE_THRESHOLD;\n transformOrigin = TransformOrigin.Right;\n }\n\n return { left, top: newY, height: previewHeight, width: previewWidth, transformOrigin, position: 'absolute', originalWidth: width, originalHeight: height };\n};\n",":local {\n .positionWrapper {\n z-index: $cv-hover-portal-z-index; \n }\n .animationWrapper {\n animation: zoom 0.8s ease-in;\n }\n @keyframes :local(zoom) {\n 0% {\n transform: scale(var(--scale));\n }\n 20% {\n transform: scale(var(--scale)/5);\n }\n }\n}","import React from 'react';\nimport { createHtmlPortalNode, InPortal } from 'react-reverse-portal';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { VideoPreviewContext } from 'libs/shared/context/VideoPreviewContext';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { useHoverLogger } from 'libs/shared/hooks/UseHoverLogger';\n\nimport { calculatePosition, HoverPositionConfig } from './hoverToPortalContainerUtil';\n\nimport styles from './hover-to-portal-container.module.scss';\n\nexport interface HoverableProps {\n isHovering: boolean;\n thumbnailHoverRef?: any;\n hoverPositionConfig?: HoverPositionConfig | HashObject;\n cleanPortalNode?: () => void;\n}\n\ninterface HoverToPortalContainerProps<T=any> {\n hoverableComponent: (props: HoverableProps) => JSX.Element;\n componentProps: T;\n fixedHoverWidth?: number;\n minHoverWidth?: number;\n hoverScale?: number;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function HoverToPortalContainer<T=any>(props: HoverToPortalContainerProps<T>): JSX.Element {\n const { hoverableComponent, componentProps, minHoverWidth, fixedHoverWidth, hoverScale } = props;\n const { setPreviewContentNode } = React.useContext(VideoPreviewContext);\n if (setPreviewContentNode === undefined) {\n Core.ErrorHelper.throw(new DevError(`Please use VideoPreviewContext inside a VideoPreviewContextProvider`));\n }\n\n const portalNode = React.useMemo(() => createHtmlPortalNode(), []);\n\n const [ thumbnailHoverRef, isThumbnailHovering ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const [ hoverCardRef, isHoverCardHovering ] = useHover<HTMLDivElement>();\n\n // eslint-disable-next-line\n const [ debugShow, setDebugShow ] = React.useState(false);\n\n const videoPositionRef = React.useRef<HTMLDivElement>(null);\n const prevStatus = React.useRef<boolean>(false);\n const currentIsHovering = isThumbnailHovering || isHoverCardHovering;\n\n useHoverLogger(currentIsHovering, props.analyticsData, props.analyticsOptions);\n\n React.useEffect(() => {\n if (prevStatus.current === currentIsHovering)\n return;\n if (currentIsHovering || debugShow) {\n setPreviewContentNode(portalNode);\n } else {\n setPreviewContentNode(null);\n }\n prevStatus.current = currentIsHovering;\n }, [currentIsHovering]);\n\n /**\n * Uncomment this if you want the hover to portal container to persist after a single hover\n * so you can inspect it's html - Sha\n */\n // React.useEffect(() => {\n // if (currentIsHovering)\n // setDebugShow(true);\n // }, [currentIsHovering]);\n\n const { x, y, width, height } = videoPositionRef.current?.getBoundingClientRect?.() || {};\n\n const hoverPositionConfig = React.useMemo(\n () => calculatePosition({ x, y, width, height }, fixedHoverWidth, minHoverWidth, hoverScale),\n [ x, y, width, height, hoverScale ]\n );\n const scale = hoverPositionConfig ? hoverPositionConfig.originalWidth / hoverPositionConfig.width : 1;\n\n const HoverableComponent = hoverableComponent;\n\n return (\n <div ref={videoPositionRef} >\n <div ref={thumbnailHoverRef}>\n <HoverableComponent isHovering={false} {...componentProps}/>\n </div>\n\n {(currentIsHovering || debugShow) && (\n <InPortal node={portalNode}>\n <div\n className={`${styles.positionWrapper} ${styles.animationWrapper}`}\n style={{\n '--scale': scale,\n ...hoverPositionConfig\n } as unknown as React.CSSProperties}\n ref={hoverCardRef}\n >\n <HoverableComponent\n isHovering={true}\n hoverPositionConfig={hoverPositionConfig}\n cleanPortalNode={() => setPreviewContentNode(null)}\n {...componentProps}/>\n </div>\n </InPortal>\n )}\n </div>\n );\n}\n\nHoverToPortalContainer.ReferenceContainer = (props: React.PropsWithChildren) => {\n return (\n <div id='content-width-reference' className='flex-grow-1'>\n {props.children}\n </div>\n );\n};\n","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.module.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}\n","@import '~styles/utils/mixins';\n:local {\n .badgeContainer {\n position: absolute;\n bottom: map-get($spacers, 2);\n right: map-get($spacers, 2);\n z-index: 2;\n \n :global(.rating-badge) {\n @include thumbnail-poster-badge;\n }\n \n :global(.duration-badge-new) {\n @include thumbnail-poster-badge;\n line-height: 1.3;\n }\n\n &.sm {\n :global(.duration-badge-new) {\n font-size: 90%;\n height: 1.3rem;\n line-height: 1.1;\n }\n }\n }\n}","import React from 'react';\n\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { BadgeListContainer } from 'libs/shared/components/badges/BadgeListContainer';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { Audience, Video } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './video-thumbnail-badges.module.scss';\n\ninterface VideoThumbnailBadgesProps {\n video?: Video;\n audience?: Audience;\n hideRating?: boolean;\n hideDuration?: boolean;\n newDurationStyle?: boolean;\n size?: VideoItemSize;\n duration?: number;\n}\n\nVideoThumbnailBadges.defaultProps = {\n newDurationStyle: true,\n size: 'md'\n};\n\nexport function VideoThumbnailBadges(props: VideoThumbnailBadgesProps): JSX.Element {\n const rating = VideoHelper.getRating(props.video);\n\n const showAudience = !!props.audience && props.size !== 'sm';\n const showRating = !showAudience && !props.hideRating && !!rating && props.size !== 'sm';\n\n if (props.hideDuration && !showAudience && !showRating)\n return <></>;\n\n return (\n <BadgeListContainer className={`${styles.badgeContainer} ${props.size === 'sm' ? styles.sm : ''}`}>\n {showAudience && (\n <AudienceLabel\n audience={props.audience}\n className='bg-white text-dark'\n border='dark'\n />\n )}\n {showRating && (\n <Badge\n type={BadgeType.Rating}\n data={rating}\n />\n )}\n {!props.hideDuration && (\n <Badge\n type={props.newDurationStyle ? BadgeType.DurationApproximate : BadgeType.DurationExact}\n data={props.duration || VideoHelper.getDuration(props.video)}\n />\n )}\n </BadgeListContainer>\n );\n}\n","import React from 'react';\nimport { Placement } from 'react-bootstrap/esm/types';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { LockSvg } from 'libs/shared/images/svg/status/LockSvg';\nimport { VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface RestrictionPadlockProps {\n tooltip?: string;\n className?: string;\n tooltipPlacement?: Placement;\n size?: VideoItemSize;\n video: VideoTypes;\n yearGroups: YearGroup[];\n}\n\nexport function RestrictionPadlock(props: RestrictionPadlockProps): JSX.Element {\n if (!props.yearGroups)\n return <></>;\n\n const title = RestrictionHelper.mapRestrictionToText(props.video._restrictions, props.yearGroups);\n const { canConsume } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canConsume || !title)\n return <></>;\n\n return (\n <Tooltip\n spanHack\n spanHackClassName={props.className || 'd-inline-block ps-1'}\n title={title}\n placement={props.tooltipPlacement || 'top'}\n >\n <SvgContainer\n svg={LockSvg}\n size={props.size === 'sm' ? SvgContainerSize.Small : SvgContainerSize.Standard}\n />\n </Tooltip>\n );\n}\n",":local {\n .dot {\n width: 0.5rem;\n height: 0.5rem;\n margin-bottom: 0.2rem;\n\n &.smallText {\n margin-bottom: 0.1rem;\n }\n }\n\n .title {\n line-height: 1.5;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { RestrictionPadlock } from 'libs/shared/components/video-list/components/restriction-padlock/RestrictionPadlock';\nimport { Video, YearGroup } from 'libs/shared/interfaces';\n\nimport styles from './video-title.module.scss';\n\nconst namespace = 'shared.videoTitle';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst TODAY = new Date();\n\nexport type VideoTitleSizes = 'h4' | 'h5' | 'h6';\n\ninterface VideoTitleProps {\n video: Video;\n yearGroups?: YearGroup[];\n showNewVideoIndicator?: boolean;\n title?: string;\n showPadlock: boolean;\n\n lockSize?: 'sm' | 'md';\n titleSize?: VideoTitleSizes;\n className?: string;\n}\n\nfunction isDateInCurrentMonth(target: string) {\n return DateHelper.isSame(target, TODAY, 'year') && DateHelper.isSame(target, TODAY, 'month');\n}\n\nVideoTitle.defaultProps = {\n titleSize: 'h6',\n className: ''\n};\n\nexport function VideoTitle(props: VideoTitleProps): JSX.Element {\n const dateRelease = props.video.dateReleased;\n const isCurrentMonth = dateRelease && isDateInCurrentMonth(dateRelease);\n\n const shouldShowNewVideoIndicator = props.showNewVideoIndicator\n && isCurrentMonth\n && props.video._isClickViewCurated?.value;\n\n return (\n <>\n <Tooltip\n title={`${shouldShowNewVideoIndicator ? getPhrase('newVideo') : ''}`}\n spanHack\n spanHackClassName='d-inline-block'\n >\n {shouldShowNewVideoIndicator && (\n <span className={`rounded-circle bg-green d-inline-block me-1 ${styles.dot} ${props.titleSize === 'h6' ? styles.smallText : ''}`} />\n )}\n </Tooltip>\n\n <h2 className={`${props.titleSize} ${styles.title} ${props.className} d-inline`}>\n {props.title || props.video.name}\n </h2>\n\n {props.showPadlock && (\n <RestrictionPadlock\n video={props.video}\n yearGroups={props.yearGroups}\n size={props.lockSize}\n />\n )}\n </>\n );\n}\n\n","@import '~styles/utils/include-media';\n:local {\n .container {\n // This fixes https://clickview.atlassian.net/browse/INBOX-5387\n z-index: 10000;\n }\n\n .titleContainer{\n min-width: 0;\n }\n\n .badgeContainer {\n height: 1.5rem;\n }\n\n .audienceBadge {\n @include media('<=sm') {\n display: none;\n }\n }\n}","import React from 'react';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopoutVideoThumbnailProps } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport styles from './thumbnail-text.module.scss';\n\ntype VideoThumbnailTextProps = Pick<PopoutVideoThumbnailProps, 'video' | 'appLink' | 'commonVideoProps'>;\n\nexport function ThumbnailText(props: VideoThumbnailTextProps): JSX.Element {\n const { video, appLink } = props;\n const { canNavigate } = VideoHelper.getCanBeConsumed(video);\n\n return (\n <div className={`mt-2 ${styles.container}`}>\n <div className={`d-flex flex-column ${styles.titleContainer}`}>\n {VideoHelper.isVideo(video) && (\n <VideoSubText\n type={props.commonVideoProps.subTextType}\n className='text-truncate'\n video={video}\n appLink={props.commonVideoProps.getSubTextAppLink?.(props.video)}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n )}\n <AppLink className='text-reset clamp-2 align-middle' appLink={canNavigate ? appLink : null}>\n <VideoTitle\n video={props.video}\n yearGroups={props.commonVideoProps.yearGroups}\n lockSize='sm'\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n </div>\n </div>\n );\n}\n",":local {\n .tag {\n background-color: $gray-100;\n height: 2rem;\n\n .icon {\n width: 1.5rem;\n height: 1.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n\n svg {\n transform: scale(0.85);\n }\n }\n\n &:hover:not(.disabled) {\n background-color: $light-blue;\n }\n\n &.active {\n background-color: $light-blue;\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgIcon } from 'libs/shared/utils/SvgHelper';\n\nimport { AppLink } from '../../app-link/AppLink';\n\nimport styles from './video-guidance-tag.module.scss';\n\ninterface VideoGuidanceTagProps {\n text: string;\n svg: SvgIcon;\n iconVariant: string;\n active?: boolean;\n appLink?: Core.AppLink;\n appLinkAnalyticsData?: HashObject;\n appLinkAnalyticsOptions?: AnalyticsOptions;\n theme?: {\n tabLabel?: string,\n container?: string\n };\n}\n\nfunction ContainerWrapper(props: VideoGuidanceTagProps): JSX.Element {\n if (props.appLink) {\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.appLinkAnalyticsData}\n analyticsOptions={props.appLinkAnalyticsOptions}\n className={`\n p-1 pe-2 rounded-pill d-inline-flex align-items-center cursor-pointer\n text-decoration-none ${props.theme?.container} ${styles.tag} ${props.active ? styles.active : ''}\n `}\n >\n <VideoGuidanceTag {...props} />\n </AppLink>\n );\n }\n\n return (\n <div\n className={`p-1 pe-2 rounded-pill d-inline-flex align-items-center ${props.theme?.container} ${styles.tag} ${styles.disabled}`}\n >\n <VideoGuidanceTag {...props} />\n </div>\n );\n}\n\nfunction VideoGuidanceTag(props: VideoGuidanceTagProps): JSX.Element {\n return (\n <>\n <SvgContainer\n className={`${styles.icon} rounded-circle bg-${props.iconVariant} text-white`}\n svg={props.svg}\n />\n\n <span className={`ps-1 text-nowrap user-select-none ${props.theme?.tabLabel}`}>\n {props.text}\n </span>\n </>\n );\n}\n\nexport { ContainerWrapper as VideoGuidanceTag };\n","import React from 'react';\n\nexport function GraduationCapSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M16.863 20c-.662 0-1.21-.567-1.21-1.252s.548-1.252 1.21-1.252c.663 0 1.21.567 1.21 1.252S17.527 20 16.864 20m0-1.441a.183.183 0 0 0-.182.189c0 .118.068.189.182.189.115 0 .183-.071.183-.19a.183.183 0 0 0-.183-.188m0-.118a.516.516 0 0 1-.502-.52v-6.19L11.75 9.158a.53.53 0 0 1-.205-.71c.137-.26.456-.354.685-.212l4.886 2.717a.57.57 0 0 1 .274.473v6.496a.52.52 0 0 1-.526.52m-4.908-4.205a.8.8 0 0 1-.229-.048L2.296 9.51A.55.55 0 0 1 2 9.014c0-.212.114-.401.297-.472l9.52-4.489a.47.47 0 0 1 .434 0l9.452 4.489a.55.55 0 0 1 .297.472.49.49 0 0 1-.297.473l-9.52 4.701a.8.8 0 0 1-.228.048m-8.22-5.198 8.22 4.087 8.288-4.087-8.22-3.898zm8.151 8.41c-4.749 0-6.644-2.905-6.712-3.047a.7.7 0 0 1-.092-.284V10.81c0-.283.229-.52.503-.52s.502.237.502.52v3.142c.388.496 2.077 2.434 5.776 2.434 3.653 0 5.548-1.938 6.005-2.457v-2.93c0-.284.228-.52.502-.52s.502.236.502.52v3.118a.6.6 0 0 1-.091.307c-.046.142-2.192 3.024-6.895 3.024'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.classroomGuideTag';\n\ninterface ClassroomGuideTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ClassroomGuideTag(props: ClassroomGuideTagProps): JSX.Element {\n if (!props.video || VideoHelper.isInteractive(props.video) || VideoHelper.isClip(props.video))\n return <></>;\n\n if (!props.video._hasCurriculumLinks?.value)\n return <></>;\n\n return (\n <VideoGuidanceTag\n theme={{\n container: 'classroom-guide-tag',\n tabLabel: 'classroom-guide-tag-label'\n }}\n svg={GraduationCapSvg}\n iconVariant='navy'\n text={LanguageService.getPhrase(namespace, 'curriculum')}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'curriculum',\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { InteractiveSvg } from 'libs/shared/images/svg/objects/InteractiveSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.interactivesTag';\n\ninterface InteractivesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function InteractivesTag(props: InteractivesTagProps): JSX.Element {\n if (!VideoHelper.showInteractivesGuidance(props.video))\n return <></>;\n \n const interactiveCount = !VideoHelper.isInteractive(props.video) && (props.video.interactives?.data.length || 0);\n\n return (\n <VideoGuidanceTag\n svg={InteractiveSvg}\n iconVariant='green'\n text={LanguageService.getPhrase(namespace, 'interactives', { smartCount: interactiveCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'interactive',\n videoGuidanceTotalItems: interactiveCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, UserAction } from 'libs/analytics/interfaces';\n\nimport { VideoGuidanceTag } from 'libs/shared/components/video-guidance/tag/VideoGuidanceTag';\nimport { ResourcesSvg } from 'libs/shared/images/svg/objects/ResourcesSvg';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'shared.resourcesTag';\n\nfunction getResourceCount(video: VideoTypes): number {\n if (VideoHelper.isInteractive(video))\n return 0;\n\n return (\n (video.resources?.data.length || 0) +\n (video.links?.data.length || 0)\n );\n}\n\ninterface ResourcesTagProps {\n video: VideoTypes;\n appLink: Core.AppLink;\n analyticsData: HashObject;\n analyticsOptions: AnalyticsOptions;\n}\n\nexport function ResourcesTag(props: ResourcesTagProps): JSX.Element {\n if (!VideoHelper.showResourcesGuidance(props.video))\n return <></>;\n\n const resourceCount = getResourceCount(props.video);\n\n return (\n <VideoGuidanceTag\n svg={ResourcesSvg}\n iconVariant='indigo'\n text={LanguageService.getPhrase(namespace, 'resources', { smartCount: resourceCount })}\n appLink={props.appLink}\n appLinkAnalyticsData={{\n videoGuidanceType: 'resource',\n videoGuidanceTotalItems: resourceCount,\n ...VideoHelper.getAnalyticsData(props.video),\n ...props.analyticsData\n }}\n appLinkAnalyticsOptions={{\n actionType: UserAction.Click,\n entity: VideoHelper.getAnalyticsEntity(props.video),\n ...props.analyticsOptions\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { ClassroomGuideTag } from 'libs/shared/components/video-guidance/classroom-guide/ClassroomGuideTag';\nimport { InteractivesTag } from 'libs/shared/components/video-guidance/interactives/InteractivesTag';\nimport { ResourcesTag } from 'libs/shared/components/video-guidance/resources/ResourcesTag';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ninterface VideoItemGuidanceProps {\n video: VideoTypes;\n getVideoAppLink?: (video: VideoTypes, opts: GetVideoAppLinkOptions) => Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n containerClassName: string;\n responsiveClassName?: string;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function VideoItemGuidance(props: VideoItemGuidanceProps): JSX.Element {\n const showingResourcesAndInteractives = (\n VideoHelper.showInteractivesGuidance(props.video) &&\n VideoHelper.showResourcesGuidance(props.video)\n );\n\n const showClassroomGuide = props.commonVideoProps.features.showClassroomGuide(props.video);\n\n return (\n <div className={`${props.containerClassName} ${showingResourcesAndInteractives ? props.responsiveClassName : ''}`}>\n {showClassroomGuide && (\n <ClassroomGuideTag\n appLink={props.commonVideoProps.getClassroomGuideAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n )}\n <ResourcesTag\n appLink={props.commonVideoProps.getResourceGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n <InteractivesTag\n appLink={props.commonVideoProps.getInteractiveGuidanceAppLink?.(props.video.id, props.video.typeId)}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n />\n </div>\n );\n}\n",":local {\n .button {\n background-color: rgba($gray-200, 0.8);\n border-radius: 50%;\n width: 1.875rem;\n height: 1.875rem;\n\n &:hover {\n background-color: rgba($gray-200, 0.9);\n }\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { CloseSvg } from 'libs/shared/images/svg/actions/CloseSvg';\n\nimport { DivButton } from '../../div-button/DivButton';\nimport { SvgContainer } from '../../svg-container/SvgContainer';\nimport { Tooltip } from '../../tooltip/Tooltip';\n\nimport styles from './remove-video-button.module.scss';\n\nconst namespace = 'shared.removeVideoButton';\n\ninterface RemoveVideoButtonProps {\n onClickRemove: (e: React.MouseEvent<HTMLButtonElement>) => void;\n removeButtonTooltip?: string;\n preventFocus?: boolean;\n}\n\nexport function RemoveVideoButton(props: RemoveVideoButtonProps): JSX.Element {\n const tooltip = props.removeButtonTooltip || LanguageService.getPhrase(namespace, 'removeFromRow');\n\n return (\n <div className='me-2'>\n <Tooltip title={tooltip} spanHack>\n <DivButton\n onClick={props.onClickRemove}\n className={`d-flex align-items-center justify-content-center ${styles.button}`}\n tabIndex={props.preventFocus ? -1 : undefined}\n >\n <SvgContainer\n svg={CloseSvg}\n className={`svg-container ${styles.heart}`}\n />\n </DivButton>\n </Tooltip>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n:local {\n $overlay-index: 2;\n $overlay-actions-index: 3;\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .details {\n overflow-y: auto;\n display: none;\n\n &.isHovering {\n display: block;\n }\n }\n\n .videoGuidanceTags {\n z-index: 1;\n position: relative;\n box-shadow: none;\n transition: box-shadow .1s ease-in;\n padding: 0 0.94rem 0.94rem 0.94rem;\n }\n\n .responsiveGuidance {\n @include responsive-guidance-tags;\n }\n\n .dropdown {\n height: 0;\n transition: height .3s ease-in-out;\n\n &.show {\n height: 10rem;\n padding: 0 0.94rem 0.94rem 0.94rem;\n }\n }\n\n .topRightContainer {\n position: absolute;\n top: 0;\n right: 0;\n\n padding-top: map-get($spacers, 2);\n padding-right: map-get($spacers, 2);\n z-index: 5;\n\n transform: translate3d(0,0,0);\n\n display: flex;\n align-items: center;\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { HoverableProps, HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { ThumbnailPadlock } from 'libs/shared/components/thumbnails/thumbnail-actions/padlock/ThumbnailPadlock';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailText } from 'libs/shared/components/thumbnails/thumbnail-text/ThumbnailText';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoItemGuidance } from 'libs/shared/components/video-list/components/video-guidance/VideoItemGuidance';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { RemoveVideoButton } from '../../remove-button/RemoveVideoButton';\nimport { ThumbnailCompanyLogo } from '../../thumbnail-company/ThumbnailCompanyLogo';\nimport { PopoutVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './popout-video-thumbnail.module.scss';\n\ntype PopoutVideoProps = HoverableProps & PopoutVideoThumbnailProps;\n\nconst PopoutVideo = (props: PopoutVideoProps): JSX.Element => {\n const {\n video, appLink, imageOptions, preload, isHovering\n } = props;\n const { hoverToPlay } = props.commonVideoProps;\n\n const appLinkParams = ObjectHelper.isObject(appLink?.params) ? appLink?.params as HashObject : {};\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n React.useEffect(() => {\n return () => {\n props.cleanPortalNode?.();\n };\n }, []);\n\n function onClickRemove(e: React.MouseEvent<HTMLButtonElement>) {\n e.preventDefault();\n props.onClickRemove?.();\n }\n\n let className = 'position-relative bg-white';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n if (isHovering)\n className += ` rounded-3 shadow-lg`;\n \n const eventAnalyticsOptions = {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n };\n\n const showThumbnailPreviewVideo = props.isHovering && canConsume && hoverToPlay;\n const showFavouriteButton = FavouriteHelper.showFavouriteButton(props.video, isHovering);\n\n function showRemoveButton() {\n if (!FunctionHelper.isFunction(props.onClickRemove))\n return false;\n\n if (UserAgentHelper.isTabletOrMobile())\n return true;\n\n return isHovering;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n };\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <div className={className}>\n <div className={styles.topRightContainer}>\n {showRemoveButton() && (\n <RemoveVideoButton\n onClickRemove={onClickRemove}\n removeButtonTooltip={props.removeButtonTooltip}\n preventFocus\n />\n )}\n\n {showFavouriteButton && (\n <FavouriteButton\n setFavourite={props.commonVideoProps.setFavourite}\n canFavourite={props.commonVideoProps.canFavourite}\n video={video}\n analyticsData={props.analyticsData}\n analyticsOptions={eventAnalyticsOptions}\n preventFocus\n />\n )}\n\n {!canNavigate && (\n <Tooltip title={VideoHelper.getPrivacyReasoning(props.video)} spanHack spanHackClassName=''>\n <ThumbnailPadlock />\n </Tooltip>\n )}\n </div>\n\n <div className='position-relative'>\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={isHovering ? 'rounded-top-3' : 'rounded-3'}\n onClick={() => props.cleanPortalNode?.()}\n appLink={canNavigate ? appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n <BaseImage\n onClick={() => props.cleanPortalNode?.()}\n data={VideoHelper.getThumbnail(video)}\n appLink={canNavigate ? appLink : null}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus={!props.hideTitle}\n appLinkClassName={`position-absolute top-0 start-0 h-100 w-100 overflow-hidden ${isHovering ? 'rounded-top-3' : 'rounded-3'}`}\n imageClassName={isHovering ? 'rounded-top-3' : 'rounded-3'}\n >\n <ImageFallback type={ImageFallbackType.Video} />\n <div className='p-absolute w-100 h-100 text-white'>\n\n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {props.showOwner && <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />}\n \n <VideoTypeBadge video={video} />\n \n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n />\n </div>\n\n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n />\n\n {/* bottom */}\n <VideoThumbnailBottomBar video={props.video} />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={props.shareId}\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n location='popout-video'\n onRemoveVideo={props.onClickRemove}\n appLink={canNavigate ? appLink : null}\n />\n }\n </div>\n\n {!isHovering && !props.hideTitle && (\n <ThumbnailText {...props}/>\n )}\n \n <div className={`${styles.details} ${isHovering ? `${styles.isHovering} box-shadow` : ''}`}>\n {isHovering && (\n <>\n <div className={`${isHovering ? styles.videoGuidanceTags : ''}`}>\n <ThumbnailText {...props}/>\n\n {(props.showVideoGuidance && isHovering) && (\n <VideoItemGuidance\n commonVideoProps={props.commonVideoProps}\n video={props.video}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n responsiveClassName={styles.responsiveGuidance}\n containerClassName='d-flex justify-content-start align-items-center pt-2'\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport function PopoutVideoThumbnail(props: PopoutVideoThumbnailProps): JSX.Element {\n return (\n <>\n <HoverToPortalContainer<PopoutVideoThumbnailProps>\n hoverableComponent={PopoutVideo}\n componentProps={props}\n fixedHoverWidth={400}\n minHoverWidth={400}\n analyticsData={{\n ...props.analyticsData,\n id: props.video.id,\n name: props.video.name\n }}\n analyticsOptions={{\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(props.video)\n }}\n />\n </>\n );\n}\n","import React from 'react';\n\nexport function PlayCircleFilledSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fillRule='evenodd'\n d='M0 12C0 5.373 5.373 0 12 0s12 5.373 12 12-5.373 12-12 12S0 18.627 0 12M9 7.498c0-.551.387-.756.847-.469l7.306 4.567c.468.292.46.77 0 1.058l-7.306 4.567c-.468.292-.847.074-.847-.47z'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n .mask {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 2;\n background-color: $black;\n opacity: 0;\n transition: opacity 100ms ease-in-out;\n }\n\n .small {\n .video {\n @extend %icon;\n width: 2rem;\n height: 2rem;\n } \n }\n\n .video {\n @extend %icon;\n width: 30%;\n height: 30%;\n }\n\n .playlist {\n @extend %icon;\n }\n\n %icon {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 4;\n color: $white;\n opacity: 0;\n transform: translate3D(-50%, -50%, 0);\n transition: opacity 100ms ease-in-out;\n }\n\n // Only purpose of this container is to trigger the hover event change\n // to the child elements\n .maskContainer {\n &:hover {\n .mask {\n opacity: 0.5;\n }\n\n .playlist,\n .video {\n opacity: 1;\n }\n }\n }\n\n .constantIconMaskContainer {\n %icon {\n color: $gray-900;\n }\n\n .mask {\n opacity: 0;\n }\n\n .playlist,\n .video {\n opacity: 0.8;\n }\n }\n}\n","import * as React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PlayCircleFilledSvg } from 'libs/shared/images/svg/actions/PlayCircleFilledSvg';\nimport { PlayCircleSvg } from 'libs/shared/images/svg/actions/PlayCircleSvg';\n\nimport styles from './mask.module.scss';\n\nexport enum MaskType {\n Video,\n Playlist,\n Series\n}\n\nfunction getClassByType(type: MaskType): string {\n if (type === MaskType.Video)\n return styles.video;\n\n if (type === MaskType.Playlist)\n return styles.playlist;\n\n return '';\n}\n\nfunction getSvg(type: MaskType, displayInverse: boolean = false) {\n if (type === MaskType.Video)\n return displayInverse ? PlayCircleFilledSvg : PlayCircleSvg;\n\n return null;\n}\n\ntype MaskSize = 'sm' | 'md';\n\ninterface MaskProps {\n type: MaskType;\n size?: MaskSize;\n alwaysShowIcon?: boolean;\n}\n\nMask.defaults = {\n size: 'md'\n};\n\nexport function Mask(props: MaskProps): JSX.Element {\n const { type, size, alwaysShowIcon } = props;\n\n const typeClass = getClassByType(type);\n const svg = getSvg(type, alwaysShowIcon);\n\n return (\n <div\n className={`${alwaysShowIcon ? styles.constantIconMaskContainer : styles.maskContainer} ${size === 'sm' ? styles.small : ''}`}\n >\n <div className={ styles.mask }></div>\n <SvgContainer svg={svg} className={ typeClass } />\n </div>\n );\n}\n","import React from 'react';\n\nexport function TickSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M18.783 5.192c.264.283.291.775.06 1.098l-8.91 12.444a.6.6 0 0 1-.457.266.58.58 0 0 1-.471-.228l-3.819-4.666a.905.905 0 0 1 0-1.1c.249-.304.652-.304.9 0l3.338 4.078 8.46-11.818c.232-.324.634-.356.899-.074'\n fill='currentColor'\n />\n </svg>\n );\n}\n",":local {\n $badge-size: 1.875rem;\n\n .unchecked {\n color: $dark;\n background-color: rgba($gray-200, 0.5);\n\n &.outline {\n background-color: $white;\n border: 1px solid $dark;\n\n &[disabled] {\n border-color: $gray-400;\n color: $gray-400;\n }\n }\n\n &:not([disabled]):hover {\n color: $white;\n background-color: $green;\n opacity: 0.75;\n display: inline-block;\n border-color: $green;\n }\n }\n\n .checked {\n color: $white;\n background-color: $green;\n\n &.outline {\n border: 1px solid $green;\n }\n }\n\n .checkMark {\n width: $badge-size;\n height: $badge-size;\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { TickSvg } from 'libs/shared/images/svg/status/TickSvg';\n\nimport { DivButton } from '../div-button/DivButton';\n\nimport styles from './check-mark-button.module.scss';\n\nexport enum CheckMarkStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n\nexport type SetCheckMarkStatusFunc = (status: CheckMarkStatus) => Promise<void>;\n\ninterface CheckMarkButtonProps {\n setStatus: SetCheckMarkStatusFunc;\n status: CheckMarkStatus;\n style?: 'outline' | 'filled';\n className?: string;\n disabled?: boolean;\n}\n\nCheckMarkButton.defaultProps = {\n style: 'filled'\n};\n\nexport function CheckMarkButton(props: CheckMarkButtonProps): JSX.Element {\n // Use local state so that changes are reflected immediately.\n const [ isComplete, setIsComplete ] = React.useState(props.status === CheckMarkStatus.Complete);\n\n React.useEffect(() => {\n setIsComplete(props.status === CheckMarkStatus.Complete);\n }, [props.status]);\n\n let className = `cursor-pointer rounded-circle ${isComplete ? styles.checked : styles.unchecked}`;\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (props.style === 'outline')\n className += ` ${styles.outline}`;\n\n function shouldRender(): boolean {\n return (\n !!props.status &&\n props.status !== CheckMarkStatus.None &&\n FunctionHelper.isFunction(props.setStatus)\n );\n }\n\n function onClick(): void {\n const shouldComplete = !isComplete;\n\n setIsComplete(shouldComplete);\n\n const newStatus = shouldComplete ? CheckMarkStatus.Complete : CheckMarkStatus.Incomplete;\n\n props.setStatus(newStatus).catch(() => {\n setIsComplete(!shouldComplete);\n });\n }\n\n if (!shouldRender())\n return <></>;\n\n return (\n <DivButton className={className} onClick={onClick} disabled={props.disabled}>\n <SvgContainer\n svg={TickSvg}\n className={`svg-container ${styles.checkMark}`}\n />\n </DivButton>\n );\n}\n",":local {\n .container {\n position: absolute;\n top: map-get($spacers, 2);\n right: map-get($spacers, 2);\n z-index: 5;\n\n &.cvIcon {\n svg {\n transform: scale(0.7) translateX(1.5px);\n }\n }\n \n .action {\n &:not(:first-child) {\n margin-left: map-get($spacers, 1);\n }\n }\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces/AnalyticsTypes';\n\nimport { CheckMarkButton, CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { FavouriteButton } from 'libs/shared/components/favourite-button/FavouriteButton';\nimport { VideoItemSize } from 'libs/shared/components/video-list/BaseVideoItemProps';\nimport { CanFavouriteFunc, FavouriteFunc, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ThumbnailPadlock } from './padlock/ThumbnailPadlock';\n\nimport styles from './video-thumbnail-actions.module.scss';\n\nfunction hasActions(props: VideoThumbnailActionsProps): boolean {\n if (!VideoHelper.getCanBeConsumed(props.video)?.canConsume)\n return true;\n\n if (FunctionHelper.isFunction(props.setFavourite) && FunctionHelper.isFunction(props.canFavourite))\n return true;\n\n if (FunctionHelper.isFunction(props.setCheckMarkStatus))\n return true;\n\n return false;\n}\n\ninterface VideoThumbnailActionsProps {\n video: VideoTypes;\n setFavourite?: FavouriteFunc;\n canFavourite?: CanFavouriteFunc;\n checkMarkStatus?: CheckMarkStatus;\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n size?: VideoItemSize;\n}\n\nexport function VideoThumbnailActions(props: VideoThumbnailActionsProps): JSX.Element {\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n if (!canNavigate) {\n return (\n <div className={styles.container}>\n <ThumbnailPadlock size={props.size} />\n </div>\n );\n }\n \n if (!hasActions(props))\n return <></>;\n\n return (\n <div className={`${styles.container} d-flex align-items-center`}>\n <FavouriteButton\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n video={props.video}\n className={styles.action}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n preventFocus\n />\n\n <CheckMarkButton\n status={props.checkMarkStatus}\n setStatus={props.setCheckMarkStatus}\n className={styles.action}\n />\n </div>\n );\n}\n","export enum ThumbnailTextPosition {\n Below = 1,\n Overlay = 2,\n Independent = 3\n}\n",":local {\n $overlay-index: 2;\n\n .titleOverlay {\n color: inherit;\n line-height: 1.2;\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: $overlay-index;\n\n padding: map-get($spacers, 2);\n padding-top: 0;\n\n &.clip {\n padding-bottom: 0;\n bottom: map-get($spacers, 1) + $cv-clip-bottom-bar-height;\n\n &.large {\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height-lg;\n }\n }\n\n &.interactive {\n padding-bottom: 0;\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height;\n\n &.large {\n bottom: map-get($spacers, 1) + $cv-interactive-bottom-bar-height-lg;\n }\n }\n }\n\n .titleBelow {\n margin-top: map-get($spacers, 1);\n line-height: 1.2;\n }\n\n .overlayContainer {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: map-get($spacers, 1);\n color: $white;\n }\n\n .topLeftContainer {\n position: absolute;\n top: map-get($spacers, 2);\n left: map-get($spacers, 2);\n z-index: 3;\n }\n\n .gradient {\n &::after {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n to top,\n rgba(0, 0, 0, 0.55) 00%,\n rgba(0, 0, 0, 0.5) 05%,\n rgba(0, 0, 0, 0.4) 10%,\n rgba(0, 0, 0, 0.2) 25%,\n rgba(0, 0, 0, 0.05) 50%,\n rgba(0, 0, 0, 0.02) 60%,\n rgba(0, 0, 0, 0) 80%\n );\n }\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ClickDescriptor, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { Mask, MaskType } from 'libs/shared/components/mask/Mask';\nimport { VideoThumbnailBottomBar } from 'libs/shared/components/thumbnails/bottom-bar/VideoThumbnailBottomBar';\nimport { LiteOwnerAvatar } from 'libs/shared/components/thumbnails/lite-owner-avatar/LiteOwnerAvatar';\nimport { PluginHover } from 'libs/shared/components/thumbnails/plugin-hover/PluginHover';\nimport { VideoThumbnailActions } from 'libs/shared/components/thumbnails/thumbnail-actions/VideoThumbnailActions';\nimport { VideoThumbnailBadges } from 'libs/shared/components/thumbnails/thumbnail-badges/VideoThumbnailBadges';\nimport { ThumbnailCompanyLogo } from 'libs/shared/components/thumbnails/thumbnail-company/ThumbnailCompanyLogo';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { VideoSubText } from 'libs/shared/components/video-sub-text/VideoSubText';\nimport { VideoTitle } from 'libs/shared/components/video-title/VideoTitle';\nimport { VideoTypeBadge } from 'libs/shared/components/video-type-badge/VideoTypeBadge';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { ImageType } from 'libs/shared/enums/Images';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useHover, useHoverIntent } from 'libs/shared/hooks/UseHover';\nimport { FavouriteHelper } from 'libs/shared/utils/FavouriteHelpers';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { CosmeticVideoThumbnailProps, StaticVideoThumbnailProps } from '../VideoThumbnail';\n\nimport styles from './static-video-thumbnail.module.scss';\n\nconst namespace = 'shared.staticVideoThumbnail';\n\ntype CombinedProps = StaticVideoThumbnailProps | CosmeticVideoThumbnailProps;\n\nfunction ThumbnailText(props: CombinedProps): JSX.Element {\n const { type, video, textPosition } = props;\n\n const isStatic = type === 'static';\n\n const textIsOverlayed = textPosition === ThumbnailTextPosition.Overlay;\n const { canNavigate } = VideoHelper.getCanBeConsumed(props.video);\n\n let className = '';\n\n if (textIsOverlayed) {\n className = styles.titleOverlay;\n\n if (canNavigate) {\n if (VideoHelper.isClip(video))\n className += ' ' + styles.clip;\n if (VideoHelper.isInteractive(video))\n className += ' ' + styles.interactive;\n }\n } else {\n className = styles.titleBelow;\n }\n\n return (\n <div className={className}>\n {VideoHelper.isVideo(video) &&\n <VideoSubText\n type={isStatic ? props.commonVideoProps.subTextType : 'series'}\n className={textIsOverlayed ? 'text-shadow clamp-1' : 'clamp-2'}\n video={video}\n appLink={isStatic && !textIsOverlayed ? props.commonVideoProps.getSubTextAppLink?.(props.video) : null}\n analyticsOptions={{ location: LocationContext.VideoThumbnail }}\n />\n }\n\n {(textIsOverlayed || !canNavigate || !isStatic) ?\n (\n <span className='h6 text-reset clamp-1'>\n <VideoTitle\n video={video}\n title={video.name ?? LanguageService.getPhrase(namespace, 'videoUnavailable')}\n showNewVideoIndicator={isStatic && props.commonVideoProps.showNewVideoIndicator}\n showPadlock={isStatic\n && !props.commonVideoProps.hasStudentExperience\n && !props.commonVideoProps.hasGuestExperience}\n />\n </span>\n ) : (\n <AppLink className='h6 text-reset clamp-2' appLink={props.appLink}>\n <VideoTitle\n video={video}\n showNewVideoIndicator={props.commonVideoProps.showNewVideoIndicator}\n showPadlock={!props.commonVideoProps.hasStudentExperience && !props.commonVideoProps.hasGuestExperience}\n />\n </AppLink>\n )\n }\n </div>\n );\n}\n\nexport function StaticVideoThumbnail(props: CombinedProps): JSX.Element {\n const { type, video, textPosition, imageOptions, preload, alwaysShowIcon } = props;\n const hoverToPlay = 'commonVideoProps' in props ? props.commonVideoProps?.hoverToPlay : false;\n\n const isStatic = type === 'static';\n\n const appLinkParams = isStatic && ObjectHelper.isObject(props.appLink?.params) ?\n props.appLink?.params as HashObject :\n {};\n\n const [ hoverRef, isHovering ] = useHover<HTMLDivElement>();\n const [ hoverIntentRef, isHoveringIntentionally ] = useHoverIntent<HTMLDivElement>({ delay: 100 });\n const { canNavigate, canConsume } = VideoHelper.getCanBeConsumed(video);\n\n function setHoverRefs(r: HTMLDivElement) {\n hoverRef.current = r;\n hoverIntentRef.current = r;\n }\n\n const showThumbnailPreviewVideo = isStatic && isHoveringIntentionally && canConsume && hoverToPlay;\n\n function canFavourite(): boolean {\n if (!isStatic)\n return;\n\n return !props.disableFavourite &&\n props.commonVideoProps.canFavourite?.(props.video) &&\n FavouriteHelper.showFavouriteButton(video, isHovering);\n }\n\n function getContainerClass(): string {\n let className = 'position-relative';\n\n className += (isStatic && props.appLink && canNavigate) ? ' cursor-pointer' : '';\n\n if (props.extraClasses)\n className += ` ${props.extraClasses}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` rounded overflow-hidden`;\n\n return className;\n }\n\n function getThumbnailClass(): string {\n let className = `overflow-hidden ${props.size === 'sm' ? 'rounded' : 'rounded-3'}`;\n\n if (props.imageClassName)\n className += ` ${props.imageClassName}`;\n\n if (textPosition === ThumbnailTextPosition.Overlay)\n className += ` ${styles.gradient}`;\n \n return className;\n }\n\n const eventAnalyticsOptions = isStatic ? {\n ...props.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video)\n } : {};\n\n const showMask = isStatic && !!props.appLink && !props.hideMask && canNavigate;\n const tooltip = isStatic ?\n VideoHelper.getPrivacyReasoning(props.video, props.showSignIn) :\n '';\n\n const analyticsData = isStatic ? {\n ...props.analyticsData,\n id: video.id,\n name: video.name\n } : {};\n const analyticsOptions = {\n ...eventAnalyticsOptions,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.Thumbnail\n };\n\n return (\n <Tooltip title={tooltip} spanHack spanHackClassName=''>\n <div className={getContainerClass()} ref={setHoverRefs}>\n {isStatic &&\n <PluginHover\n isPlugin={props.commonVideoProps.isPlugin}\n isPluginPopup={props.commonVideoProps.isPluginPopup}\n className={props.size === 'sm' ? 'rounded' : 'rounded-3'}\n appLink={canNavigate ? props.appLink : null}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n />\n }\n\n <VideoThumbnailActions\n video={video}\n checkMarkStatus={!isStatic && props.checkMarkStatus}\n setCheckMarkStatus={!isStatic && props.setCheckMarkStatus}\n setFavourite={isStatic && props.commonVideoProps.setFavourite}\n canFavourite={canFavourite}\n analyticsData={isStatic && props.analyticsData}\n analyticsOptions={isStatic && eventAnalyticsOptions}\n size={props.size}\n />\n\n <BaseImage\n data={VideoHelper.getThumbnail(video)}\n appLink={isStatic && canNavigate ? props.appLink : null}\n onClick={isStatic && canNavigate ? props.onClick : undefined}\n imageType={ImageType.Thumbnails}\n imageOptions={imageOptions}\n preload={preload}\n className={getThumbnailClass()}\n alt={('series' in video && video.series?.name ? `${video.series.name}: ` : '') + video.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n preventFocus\n openInNewTab={props.openInNewTab}\n forcePageLoad={props.forcePageLoad}\n >\n {showMask && (\n <Mask type={MaskType.Video} size={props.size} alwaysShowIcon={alwaysShowIcon}/>\n )}\n <ImageFallback type={ImageFallbackType.Video} />\n <div className={styles.overlayContainer}>\n {/* overlay */}\n {textPosition === ThumbnailTextPosition.Overlay && <ThumbnailText {...props} />}\n \n {/* top left */}\n <div className={`${styles.topLeftContainer} d-flex flex-no-wrap`}>\n {isStatic && props.showOwner &&\n <LiteOwnerAvatar video={video} imageCdnUrl={props.commonVideoProps.imageCdnUrl} />\n }\n \n {!props.hideVideoTypeBadge && <VideoTypeBadge video={video} size={props.size} />}\n\n {isStatic &&\n <ThumbnailCompanyLogo\n video={video}\n companyLogoFallbackUrl={props.commonVideoProps.getCompanyLogoFallbackUrl?.(video)}\n size={props.size}\n />\n }\n </div>\n\n {/* bottom */}\n {!props.hideBottomBar &&\n <VideoThumbnailBottomBar video={video} />\n }\n \n {/* bottom right */}\n <VideoThumbnailBadges\n video={props.video}\n audience={props.audience}\n hideRating={props.hideRating}\n hideDuration={props.hideDuration}\n newDurationStyle={props.newDurationStyle}\n size={props.size}\n />\n </div>\n </BaseImage>\n {showThumbnailPreviewVideo &&\n <GlobalPlayerConsumer\n key={props.video.id}\n objectId={props.video.id}\n objectTypeId={props.video.typeId}\n mode='hover'\n shareId={isStatic && props.shareId }\n context={appLinkParams.context}\n contextId={appLinkParams.contextId}\n moviesAndTv={appLinkParams.mtv}\n appLink={isStatic && canNavigate ? props.appLink : null}\n />\n }\n\n {textPosition === ThumbnailTextPosition.Below && <ThumbnailText {...props} />}\n </div>\n </Tooltip>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { CheckMarkStatus, SetCheckMarkStatusFunc } from 'libs/shared/components/check-mark-button/CheckMarkButton';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { Audience, VideoTypes } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { ImageOptions } from 'libs/shared/utils/ImageHelper';\n\nimport { ExpandableVideoThumbnail } from './expandable/ExpandableVideoThumbnail';\nimport { PopoutVideoThumbnail } from './popout/PopoutVideoThumbnail';\nimport { StaticVideoThumbnail } from './static/StaticVideoThumbnail';\n\ninterface BaseCommonVideoThumbnailProps {\n video: VideoTypes;\n imageOptions: ImageOptions;\n preload?: boolean;\n}\n\ninterface BasePlayableVideoThumbnailProps extends BaseCommonVideoThumbnailProps {\n appLink: Core.AppLink;\n onClick?: () => void;\n analyticsData?: HashObject;\n analyticsOptions: AnalyticsOptions; // Location context required\n\n /**\n * TODO: Fix whatever this used to do in playlists\n */\n canRemovePrivateVideos?: boolean;\n showSignIn?: boolean;\n\n showOwner?: boolean;\n\n shareId?: string;\n\n commonVideoProps: CommonVideoProps;\n}\n\nexport interface ExpandableVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'expandable';\n newDurationStyle?: boolean;\n hovering: boolean;\n}\n\nexport interface PopoutVideoThumbnailProps extends BasePlayableVideoThumbnailProps {\n type: 'popout';\n hideDuration: boolean;\n extraClasses?: string;\n hideRating?: boolean;\n hideTitle?: boolean;\n showVideoGuidance: boolean;\n onClickRemove: () => void;\n removeButtonTooltip?: string;\n audience: Audience;\n}\n\ninterface BaseStaticVideoThumbnailProps {\n textPosition?: ThumbnailTextPosition;\n extraClasses?: string;\n imageClassName?: string;\n size: 'sm' | 'md';\n hideMask?: boolean;\n videoTypeBadgeSize?: 'sm' | 'std';\n hideDuration?: boolean;\n audience?: Audience;\n newDurationStyle?: boolean;\n hideRating?: boolean;\n hideVideoTypeBadge?: boolean;\n hideBottomBar?: boolean;\n alwaysShowIcon?: boolean;\n openInNewTab?: boolean;\n forcePageLoad?: boolean;\n}\n\nexport interface StaticVideoThumbnailProps extends BaseStaticVideoThumbnailProps, BasePlayableVideoThumbnailProps {\n type: 'static';\n disableFavourite?: boolean;\n}\n\n/**\n * If you need any of the following, you should be using static:\n * - Favourite button\n * - Applink to link to the video\n * - Hover to play\n * - Analytics data\n * - Showing the owner\n * - Showing sign in\n * \n * Cosmetic should just be for displaying a thumbnail that is not interacted with, or the <AppLink />\n * is outside of the thumbnail like in shares.\n * \n * - Sha\n */\nexport interface CosmeticVideoThumbnailProps extends BaseCommonVideoThumbnailProps, BaseStaticVideoThumbnailProps {\n type: 'cosmetic';\n setCheckMarkStatus?: SetCheckMarkStatusFunc;\n checkMarkStatus?: CheckMarkStatus;\n}\n\nexport type VideoThumbnailProps =\n ExpandableVideoThumbnailProps |\n PopoutVideoThumbnailProps |\n StaticVideoThumbnailProps |\n CosmeticVideoThumbnailProps;\n\nVideoThumbnail.defaultProps = {\n hideRating: true,\n size: 'md',\n showOwner: true\n};\n\nexport function VideoThumbnail(props: VideoThumbnailProps): JSX.Element {\n switch (props.type) {\n case 'static':\n return <StaticVideoThumbnail {...props} />;\n case 'cosmetic':\n // No hover to play for cosmetic use of VideoThumbnail\n return <StaticVideoThumbnail {...props} />;\n case 'expandable':\n // Expandable thumbnails show metadata on hover. Static display the duration and don't expand on hover\n return <ExpandableVideoThumbnail {...props} />;\n case 'popout':\n return <PopoutVideoThumbnail {...props} />;\n default:\n return;\n }\n}\n"],"mappings":"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"}
|