<div class="get-started-video" data-behavior="get-started-video" data-video-type="youtube" data-video-id="R7qSx1Zb-NQ">
    <div class="get-started-video__player-wrap">
        <div id=intro class="get-start-video"></div>
    </div>
    <div class="get-started-video__control-overlay">
        <a class="full-screen" href="#" role="full screen" aria-label="video full screen" tabindex="0"></a>
        <a class="close-video" href="#" role="close video" aria-label="video close" tabindex="0"></a>
        <div class="play-pause-controls">
            <a class="play-pause-controls__play hidden" role="video play" aria-label="video play button" tabindex="0" aria-selected="true"></a>
            <a class="play-pause-controls__pause" role="video pause button" aria-label="video pause button" tabindex="0" aria-selected="true"></a>
        </div>
    </div>
</div>

No notes defined.

{
  "videoId": "R7qSx1Zb-NQ",
  "type": "youtube",
  "id": "intro"
}
  • Content:
    import Player from '@vimeo/player';
    import { loadYouTubeApi } from '../video/video';
    
    export default parentElement => {
      const { videoId, videoType } = parentElement.dataset;
      const videoPlayerId = parentElement
        .querySelector('.get-start-video')
        .getAttribute('id');
      const videoControls = parentElement.querySelector(
        '.get-started-video__control-overlay'
      );
      const playVideoCta = document.querySelector('.play-video');
      const closeVideo = parentElement.querySelector('.close-video');
      const playButton = parentElement.querySelector('.play-pause-controls__play');
      const pauseButton = parentElement.querySelector(
        '.play-pause-controls__pause'
      );
      const fullscreenVideo = parentElement.querySelector('.full-screen');
    
      // eslint-disable-next-line no-unused-vars
      let videoPlayer;
    
      if (!videoId) {
        return;
      }
    
      const onPlayerError = () => {
        parentElement.classList.remove('video-player-loaded');
      };
    
      const onPlayerStateChange = event => {
        if (event.data === window.YT.PlayerState.ENDED) {
          videoPlayer.playVideo();
        }
      };
    
      const onPlayerReady = () => {
        // To capture error on video
        if (videoType === 'youtube') {
          videoPlayer.pauseVideo();
          videoPlayer.mute();
        } else {
          videoPlayer.pause();
          videoPlayer.setMuted(1);
        }
        parentElement.classList.add('video-player-loaded');
      };
    
      if (playVideoCta) {
        playVideoCta.addEventListener('click', () => {
          if (videoType === 'youtube') {
            videoPlayer.playVideo();
            videoPlayer.unMute();
          } else {
            videoPlayer.play();
            videoPlayer.setMuted(0);
          }
        });
      }
    
      closeVideo.addEventListener('click', e => {
        e.preventDefault();
    
        if (videoType === 'youtube') {
          videoPlayer.pauseVideo();
          videoPlayer.mute();
        } else {
          videoPlayer.pause();
          videoPlayer.setMuted(1);
        }
      });
    
      const initVideo = () => {
        videoPlayer = new window.YT.Player(videoPlayerId, {
          height: '100%',
          width: '100%',
          videoId,
          playerVars: {
            playsinline: 1,
            controls: 0,
          },
          events: {
            onReady: onPlayerReady,
            onError: onPlayerError,
            onStateChange: onPlayerStateChange,
          },
        });
      };
    
      if (videoType === 'youtube') {
        if (
          window.YouTubeIframeApiReady === undefined ||
          window.YouTubeIframeApiReady === false
        ) {
          loadYouTubeApi();
          window.onYouTubeIframeAPIReady = () => {
            window.YouTubeIframeApiReady = true;
            initVideo();
          };
        } else {
          initVideo();
        }
      } else {
        // eslint-disable-next-line no-undef
        videoPlayer = new Player(videoPlayerId, {
          id: videoId,
          muted: 1,
          title: 0,
          sidedock: 0,
          controls: 0,
          quality: 'auto',
          width: '100%',
          height: '100%',
        });
    
        videoPlayer
          .play()
          .then(() => {
            parentElement.classList.add('video-player-loaded');
          })
          .catch(error => {
            // eslint-disable-next-line no-console
            console.log(error);
          });
    
        videoPlayer.on('loaded', () => {
          // eslint-disable-next-line no-console
          console.log('vimeo loaded');
          parentElement.classList.add('video-player-loaded');
        });
      }
    
      parentElement.addEventListener('mouseover', () => {
        videoControls.style.opacity = '1';
      });
    
      parentElement.addEventListener('mouseleave', () => {
        videoControls.style.opacity = '0';
      });
    
      playButton.addEventListener('click', () => {
        if (videoType === 'youtube') {
          videoPlayer.playVideo();
        } else {
          videoPlayer.play();
        }
        playButton.classList.toggle('hidden');
        pauseButton.classList.toggle('hidden');
      });
    
      pauseButton.addEventListener('click', () => {
        if (videoType === 'youtube') {
          videoPlayer.pauseVideo();
        } else {
          videoPlayer.pause();
        }
        playButton.classList.toggle('hidden');
        pauseButton.classList.toggle('hidden');
      });
    
      fullscreenVideo.addEventListener('click', e => {
        e.preventDefault();
    
        const videoIframe = parentElement.querySelector(
          '.get-started-video iframe'
        );
    
        if (videoIframe.requestFullscreen) {
          videoIframe.requestFullscreen();
        } else if (videoIframe.webkitRequestFullscreen) {
          videoIframe.webkitRequestFullscreen();
        } else if (videoIframe.msRequestFullscreen) {
          videoIframe.msRequestFullscreen();
        }
      });
    };
    
  • URL: /components/raw/get-started-video/get-started-video.js
  • Filesystem Path: src/library/components/get-started-video/get-started-video.js
  • Size: 4.4 KB
  • Content:
    .get-started-video {
      position: relative;
      width: 100%;
      max-width: 69.6rem;
      height: 39.1rem;
    
      &__player-wrap {
        iframe {
          width: 100%;
          height: 100%;
          position: absolute;
          transform: translate(-50%, -50%);
          top: 50%;
          left: 50%;
          pointer-events: none;
          .player {
            width: 100% !important;
            height: 100% !important;
            object-fit: cover !important;
          }
        }
      }
    
      &__control-overlay {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 100%;
        height: 100%;
        opacity: 0;
        transition: opacity 600ms ease-in-out;
        .full-screen {
          position: absolute;
          top: 1.7rem;
          left: 2.3rem;
          background: url('./assets/images/video-fullscreen.svg') no-repeat center;
          width: 1.8rem;
          height: 1.8rem;
          background-size: 100%;
        }
        .close-video {
          position: absolute;
          top: 1.1rem;
          right: 1rem;
          background: url('./assets/images/close-video.svg') no-repeat center;
          width: 3.2rem;
          height: 3.2rem;
          background-size: 100%;
        }
        .play-pause-controls {
          position: absolute;
          cursor: pointer;
          &__play {
            display: inline-block;
            background: url('./assets/images/video-play-btn.svg') no-repeat center;
            width: 4rem;
            height: 4rem;
            background-size: 100%;
          }
          &__pause {
            display: inline-block;
            background: url('./assets/images/video-pause-btn.svg') no-repeat center;
            width: 4rem;
            height: 4rem;
            background-size: 100%;
          }
        }
      }
    
      @media screen and (min-width: $mq-medium) {
        &__control-overlay {
          .full-screen {
            top: 4.8rem;
            left: 4.8rem;
            width: 4rem;
            height: 4rem;
          }
          .close-video {
            top: 4.8rem;
            right: 4.8rem;
            width: 4.8rem;
            height: 4.8rem;
          }
          .play-pause-controls {
            &__play {
              width: 7.2rem;
              height: 7.2rem;
            }
            &__pause {
              width: 7.2rem;
              height: 7.2rem;
            }
          }
        }
      }
    
      @media screen and (max-width: $mq-small) {
        width: 34.2rem;
        height: 19.2rem;
      }
    
      @media screen and (min-width: 1800px) {
        max-width: 120.6rem;
        height: 68.1rem;
      }
    }
    
  • URL: /components/raw/get-started-video/get-started-video.scss
  • Filesystem Path: src/library/components/get-started-video/get-started-video.scss
  • Size: 2.4 KB
<div class="get-started-video" data-behavior="get-started-video" data-video-type="{{type}}" data-video-id="{{videoId}}">
    <div class="get-started-video__player-wrap">
        <div id={{id}} class="get-start-video"></div>
    </div>
    <div class="get-started-video__control-overlay">
        <a class="full-screen" href="#" role="full screen" aria-label="video full screen" tabindex="0"></a>
        <a class="close-video" href="#" role="close video" aria-label="video close" tabindex="0"></a>
        <div class="play-pause-controls">
            <a class="play-pause-controls__play hidden" role="video play" aria-label="video play button" tabindex="0"
                aria-selected="true"></a>
            <a class="play-pause-controls__pause" role="video pause button" aria-label="video pause button"
                tabindex="0" aria-selected="true"></a>
        </div>
    </div>
</div>