<div class="m-continue-video-guide js-guide-continue ">
<button type="button" class="a-button a-button--peacock-light background-peacock-light a-button--icon a-button--standalone-icon m-continue-video-guide__close js-guide-close">
<span class="a-button__text u-visuallyhidden">Stäng</span>
<svg class="icon a-button__icon u-icon--smallest">
<use xlink:href="#icon-close"></use>
</svg>
</button>
<div class="m-continue-video-guide__inner">
<a href="/components/detail/video-guide.html" class="m-continue-video-guide__continue js-guide-continue-link" data-alt-text="Fortsätt den guidade turen">
<span class="u-visuallyhidden">Guidad tur</span>
<div class="m-continue-video-guide__arrow"></div>
</a>
<progress-ring class="m-continue-video-guide__progressbar" stroke="4" radius="50" progress="70"></progress-ring>
<img class="m-continue-video-guide__image js-guide-continue-image" src="/assets/images/sticky-guide.png" alt="Fortsätt den guidade turen">
</div>
</div>
<div class="m-continue-video-guide js-guide-continue {{#if additional_classes}}{{additional_classes}}{{/if}}">
<button type="button" class="a-button a-button--peacock-light background-peacock-light a-button--icon a-button--standalone-icon m-continue-video-guide__close js-guide-close">
<span class="a-button__text u-visuallyhidden">Stäng</span>
<svg class="icon a-button__icon u-icon--smallest">
<use xlink:href="#icon-close"></use>
</svg>
</button>
<div class="m-continue-video-guide__inner">
<a href="/components/detail/video-guide.html" class="m-continue-video-guide__continue js-guide-continue-link" data-alt-text="Fortsätt den guidade turen">
<span class="u-visuallyhidden">Guidad tur</span>
<div class="m-continue-video-guide__arrow"></div>
</a>
<progress-ring class="m-continue-video-guide__progressbar" stroke="4" radius="50" progress="70"></progress-ring>
<img class="m-continue-video-guide__image js-guide-continue-image" src="/assets/images/sticky-guide.png" alt="Fortsätt den guidade turen">
</div>
</div>
{
"additional_classes": false
}
import className from '../../assets/js/className';
class ProgressRing extends HTMLElement {
constructor() {
super();
const stroke = this.getAttribute('stroke');
const radius = this.getAttribute('radius');
const normalizedRadius = radius - stroke * 2;
this.circumference = normalizedRadius * 2 * Math.PI;
this.root = this.attachShadow({ mode: 'open' });
this.root.innerHTML = `
<svg
height="${radius * 2}"
width="${radius * 2}"
>
<circle
stroke="white"
stroke-dasharray="${this.circumference} ${this.circumference}"
style="stroke-dashoffset:${this.circumference}"
stroke-width="${stroke}"
fill="transparent"
r="${normalizedRadius}"
cx="${radius}"
cy="${radius}"
/>
</svg>
<style>
circle {
transition: stroke-dashoffset 0.35s;
transform: rotate(-90deg);
transform-origin: 50% 50%;
}
</style>
`;
}
setProgress(percent) {
const offset = this.circumference - ((percent / 100) * this.circumference);
const circle = this.root.querySelector('circle');
circle.style.strokeDashoffset = offset;
}
static get observedAttributes() {
return ['progress'];
}
attributeChangedCallback(name, oldValue, newValue) {
if (name === 'progress') {
this.setProgress(newValue);
}
}
}
window.customElements.define('progress-ring', ProgressRing);
const continueElement = document.querySelector('.js-guide-continue');
// Get value from sessionStorage if present
if (sessionStorage.getItem('InmsCurrentTime')) {
const videoCurrentTime = sessionStorage.getItem('InmsCurrentTime');
const videoDuration = sessionStorage.getItem('InmsDuration');
const progressRing = document.querySelector('progress-ring');
const continueLink = document.querySelector('.js-guide-continue-link');
const guideURL = sessionStorage.getItem('InmsCurrentGuideURL');
const guideImage = sessionStorage.getItem('InmsCurrentGuideImage');
if ((videoCurrentTime > 0)
&& progressRing
&& continueElement
&& guideImage
&& continueLink) {
const alternativeText = continueLink.dataset.altText;
const currentProgress = videoCurrentTime / videoDuration;
const currentGuideImage = document.querySelector('.js-guide-continue-image');
continueElement.classList.add(className('m-continue-video-guide--has-progress'));
continueLink.setAttribute('href', guideURL);
currentGuideImage.src = guideImage;
continueLink.querySelector('span').innerText = alternativeText;
// Calculate percentage played
progressRing.setAttribute('progress', Math.floor(currentProgress * 100));
}
}
// Close Continue Component
const closeButton = document.querySelector('.js-guide-close');
if (closeButton) {
closeButton.addEventListener('click', () => {
sessionStorage.setItem('InmsGuideClosed', true);
continueElement.classList.remove('is-visible');
});
if (!sessionStorage.getItem('InmsGuideClosed')) {
continueElement.classList.add('is-visible');
}
if (document.querySelector('.js-video-guide')) {
continueElement.classList.remove('is-visible');
}
}
@charset "UTF-8";
@use '../../configurations/mixins' as mixin;
@use '../../configurations/bem' as bem;
@use '../../configurations/config' as config;
@use '../../configurations/variables' as var;
@use '../../configurations/functions' as func;
@use '../../configurations/colors/colors' as colors;
@use '../../configurations/colors/colors-functions' as colorFunc;
@use '../../vendor/grid/breakpoints' as breakpoint;
@use '../../vendor/grid/grid' as grid;
@include mixin.molecule(continue-video-guide) {
position: fixed;
bottom: 0;
right: 0;
z-index: func.z_index(middlegroundImportant);
width: 100px;
height: calc(100px + 23px + func.rhythm(1));
transform: scale(0.7);
display: none;
&.is-visible {
display: block;
}
@include breakpoint.bp-up(md) {
transform: scale(1);
bottom: func.rhythm(2);
right: func.rhythm(2);
}
@include bem.e(inner) {
position: relative;
}
@include bem.e(progressbar) {
display: none;
}
@include bem.e(continue) {
position: absolute;
z-index: 3;
display: flex;
align-items: center;
justify-content: center;
width: 100px;
height: 100px;
border-color: colors.$color-snow;
&::after {
content: 'Guidad tur';
display: block;
position: absolute;
left: auto;
right: auto;
bottom: 0;
transform: translateY(calc(100% + func.rhythm(1)));
text-align: center;
background-color: colors.$color-peacock-light;
font-size: var.$size-medium;
font-family: var.$font-family-headings;
border-radius: var.$border-radius;
color: colors.$color-cyberspace;
padding: func.rhythm(0.5) func.rhythm(1);
line-height: 1;
}
&:hover,
&:focus {
&::after {
font-size: calc(var.$size-medium + 1px);
}
}
}
@include bem.m(has-progress) {
@include bem.e(continue) {
&::after {
content: 'Fortsätt';
}
@include bem.e(arrow) {
width: 0;
height: 0;
border-style: solid;
border-width: 15px 0 15px 20px;
transition: border-width 0.25s ease-out;
border-bottom: 15px solid transparent;
border-left-color: inherit;
border-left-style: solid;
border-left-width: 20px;
border-right: 0 solid transparent;
border-top: 15px solid transparent;
}
&:hover,
&:focus {
> div {
border-width: 20px 0 20px 30px;
}
}
}
@include bem.e(progressbar) {
display: block;
position: absolute;
z-index: 2;
border-radius: 50%;
&::after {
position: absolute;
top: 6px;
left: 6px;
width: 88px;
height: 88px;
border-radius: 50%;
content: '';
display: block;
border: 4px solid rgba(colors.$color-snow, 0.5);
}
}
}
@include bem.e(image) {
position: absolute;
z-index: 1;
width: 100px;
height: 100px;
border-radius: 50%;
}
@include bem.e(close) {
border-radius: 50%;
position: absolute;
top: 0;
right: 0;
z-index: 4;
&:hover,
&:focus {
background-color: colors.$color-peacock !important;
}
}
}
This component is dependent on the Video Guide Component. Continuing a guided tour is only possible if the video player has a saved timestamp in sessionStorage