From 2fe50fe92544869c39d91451cefd2c163ef5edb0 Mon Sep 17 00:00:00 2001 From: Georgi Mateev <georgi.mateev@sgalinski.de> Date: Thu, 17 Oct 2024 13:44:09 +0300 Subject: [PATCH] [BUGFIX] Improve default template behavior --- README.md | 1 + .../Templates/Bootstrap5/Vimeo/Index.html | 2 +- .../JavaScript/Backend/LicenseNotification.js | 2 +- .../JavaScript/Dist/main.bundled.min.js | 447 +++++++++++++++++- .../JavaScript/Modules/sgVideoLightbox.js | 15 +- Resources/Public/Sass/Bootstrap5/main.scss | 2 +- Resources/Public/Sass/Modules/_sg-video.scss | 19 +- Resources/Public/Sass/main.scss | 2 +- Resources/Public/StyleSheets/main.min.css | 2 +- 9 files changed, 470 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 1e18240..18bc9d3 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ plugin.tx_sgvimeo { - Initialize the javascript modules in your main.js: ` new SgVideoLightbox(); SgVideo.initDefault();` +- If you want to recompile the JS with SGC, you must add `excludeFromQa: ['!**/Backend/**/*']` to your .sgc-config.js and also set your main extension in extensions to sg-vimeo `extensions: ['sg-vimeo']` ### Compiling SASS only without SGC diff --git a/Resources/Private/Templates/Bootstrap5/Vimeo/Index.html b/Resources/Private/Templates/Bootstrap5/Vimeo/Index.html index 005aa5c..c3c2763 100644 --- a/Resources/Private/Templates/Bootstrap5/Vimeo/Index.html +++ b/Resources/Private/Templates/Bootstrap5/Vimeo/Index.html @@ -80,7 +80,7 @@ <f:if condition="{filtersBottom} || {submitButton.position} == 'bottom' || {submitButton.position} == 'both'"> <div class="sg-video-filters sg-video-filters-bottom gap-2 d-flex align-items-baseline"> <f:for each="{filtersBottom}" as="filter"> - <f:render partial="{filter.partial}" arguments="{name: filter.name, label: filter.label}" /> + <f:render partial="{filter.partial}" arguments="{filter: filter, pluginId: pluginContentData.uid, filterValues: filterValues}" /> </f:for> <f:if condition="{submitButton.position} == 'bottom' || {submitButton.position} == 'both'"> diff --git a/Resources/Public/JavaScript/Backend/LicenseNotification.js b/Resources/Public/JavaScript/Backend/LicenseNotification.js index ab8e1a2..a72ce0d 100644 --- a/Resources/Public/JavaScript/Backend/LicenseNotification.js +++ b/Resources/Public/JavaScript/Backend/LicenseNotification.js @@ -26,7 +26,7 @@ import Notification from '@typo3/backend/notification.js'; const LicenseCheck = { - init () { + init() { fetch(TYPO3.settings.ajaxUrls['sg_vimeo::checkLicense']) .then((response) => { if (response.ok) { diff --git a/Resources/Public/JavaScript/Dist/main.bundled.min.js b/Resources/Public/JavaScript/Dist/main.bundled.min.js index 307c6f9..17f9c4b 100644 --- a/Resources/Public/JavaScript/Dist/main.bundled.min.js +++ b/Resources/Public/JavaScript/Dist/main.bundled.min.js @@ -1,8 +1,441 @@ -(()=>{var A=Object.create;var x=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,$=Object.prototype.hasOwnProperty;var g=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+n+'" is not supported')});var C=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var P=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of M(e))!$.call(n,o)&&o!==t&&x(n,o,{get:()=>e[o],enumerable:!(i=I(e,o))||i.enumerable});return n};var k=(n,e,t)=>(t=n!=null?A(U(n)):{},P(e||!n||!n.__esModule?x(t,"default",{value:n,enumerable:!0}):t,n));var L=C((w,v)=>{(function(n){typeof w=="object"&&typeof v<"u"?v.exports=n():typeof define=="function"&&define.amd?define([],n):(typeof window<"u"||typeof window<"u"?window:typeof self<"u"?self:this).basicLightbox=n()})(function(){return function n(e,t,i){function o(s,d){if(!t[s]){if(!e[s]){var p=typeof g=="function"&&g;if(!d&&p)return p(s,!0);if(a)return a(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var r=t[s]={exports:{}};e[s][0].call(r.exports,function(u){return o(e[s][1][u]||u)},r,r.exports,n,e,t,i)}return t[s].exports}for(var a=typeof g=="function"&&g,c=0;c<i.length;c++)o(i[c]);return o}({1:[function(n,e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create=t.visible=void 0;var i=function(c){var s=arguments.length>1&&arguments[1]!==void 0&&arguments[1],d=document.createElement("div");return d.innerHTML=c.trim(),s===!0?d.children:d.firstChild},o=function(c,s){var d=c.children;return d.length===1&&d[0].tagName===s},a=function(c){return(c=c||document.querySelector(".basicLightbox"))!=null&&c.ownerDocument.body.contains(c)===!0};t.visible=a,t.create=function(c,s){var d=function(r,u){var m=i(` - <div class="basicLightbox `.concat(u.className,`"> - <div class="basicLightbox__placeholder" role="dialog"></div> - </div> - `)),b=m.querySelector(".basicLightbox__placeholder");r.forEach(function(T){return b.appendChild(T)});var _=o(b,"IMG"),E=o(b,"VIDEO"),q=o(b,"IFRAME");return _===!0&&m.classList.add("basicLightbox--img"),E===!0&&m.classList.add("basicLightbox--video"),q===!0&&m.classList.add("basicLightbox--iframe"),m}(c=function(r){var u=typeof r=="string",m=r instanceof HTMLElement==1;if(u===!1&&m===!1)throw new Error("Content must be a DOM element/node or string");return u===!0?Array.from(i(r,!0)):r.tagName==="TEMPLATE"?[r.content.cloneNode(!0)]:Array.from(r.children)}(c),s=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if((r=Object.assign({},r)).closable==null&&(r.closable=!0),r.className==null&&(r.className=""),r.onShow==null&&(r.onShow=function(){}),r.onClose==null&&(r.onClose=function(){}),typeof r.closable!="boolean")throw new Error("Property `closable` must be a boolean");if(typeof r.className!="string")throw new Error("Property `className` must be a string");if(typeof r.onShow!="function")throw new Error("Property `onShow` must be a function");if(typeof r.onClose!="function")throw new Error("Property `onClose` must be a function");return r}(s)),p=function(r){return s.onClose(h)!==!1&&function(u,m){return u.classList.remove("basicLightbox--visible"),setTimeout(function(){return a(u)===!1||u.parentElement.removeChild(u),m()},410),!0}(d,function(){if(typeof r=="function")return r(h)})};s.closable===!0&&d.addEventListener("click",function(r){r.target===d&&p()});var h={element:function(){return d},visible:function(){return a(d)},show:function(r){return s.onShow(h)!==!1&&function(u,m){return document.body.appendChild(u),setTimeout(function(){requestAnimationFrame(function(){return u.classList.add("basicLightbox--visible"),m()})},10),!0}(d,function(){if(typeof r=="function")return r(h)})},close:p};return h}},{}]},{},[1])(1)})});var y=k(L()),l=class{constructor(){let e=document.querySelectorAll(".sg-video-item"),t=window.matchMedia("(max-width: 679px)").matches;e.forEach(i=>{(i.dataset.disableLightboxMobile==="1"&&t||i.dataset.disableLightbox==="1"&&!t)&&(i.classList.remove("sg-video-item"),i.addEventListener("click",l.disableLightbox.bind(this)))}),Array.prototype.forEach.call(document.querySelectorAll(".sg-video-item"),i=>{i.addEventListener("click",l.openLightbox)})}static openLightbox(e){var t,i;switch(e.preventDefault(),(i=(t=e.target.closest("a"))==null?void 0:t.dataset)==null?void 0:i.videoType){case"youtube":{l.openYouTubeLightBox(e);break}case"vimeo":{l.openVimeoLightBox(e);break}default:}}static disableLightbox(e){var t,i;switch(e.preventDefault(),(i=(t=e.target.closest("a"))==null?void 0:t.dataset)==null?void 0:i.videoType){case"youtube":{l.disableYouTubeLightbox(e);break}case"vimeo":{l.disableVimeoLightbox(e);break}default:}}static openVimeoLightBox(e){let t=e.target.closest(".sg-video-item").href;t=l.includeAdditionalUrlParameters(t,e.target.closest("a").dataset.additionalUrlParameters),t+="&autoplay=1&dnt=1",y.create(`<iframe class="sg-video-iframe sg-video-vimeo-iframe mfp-iframe" frameborder="0" allowfullscreen allow="autoplay; fullscreen *; picture-in-picture" src="${t}"></iframe>`,{closable:!0}).show()}static openYouTubeLightBox(e){let t=e.target.closest(".sg-video-item").href;t=`https://www.youtube-nocookie.com/embed/${l.getYouTubeVideoIdFromUrl(t)}`,t=l.includeAdditionalUrlParameters(t,e.target.closest("a").dataset.additionalUrlParameters),y.create(` +(() => { + var __create = Object.create; + var __defProp = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { + get: (a, b) => (typeof require !== "undefined" ? require : a)[b] + }) : x)(function(x) { + if (typeof require !== "undefined") + return require.apply(this, arguments); + throw new Error('Dynamic require of "' + x + '" is not supported'); + }); + var __commonJS = (cb, mod) => function __require2() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod + )); + + // vendor/sgalinski/sg-vimeo/node_modules/basiclightbox/dist/basicLightbox.min.js + var require_basicLightbox_min = __commonJS({ + "vendor/sgalinski/sg-vimeo/node_modules/basiclightbox/dist/basicLightbox.min.js"(exports, module) { + !function(e) { + if ("object" == typeof exports && "undefined" != typeof module) + module.exports = e(); + else if ("function" == typeof define && define.amd) + define([], e); + else { + ("undefined" != typeof window ? window : "undefined" != typeof window ? window : "undefined" != typeof self ? self : this).basicLightbox = e(); + } + }(function() { + return function e(n, t, o) { + function r(c2, u) { + if (!t[c2]) { + if (!n[c2]) { + var s = "function" == typeof __require && __require; + if (!u && s) + return s(c2, true); + if (i) + return i(c2, true); + var a = new Error("Cannot find module '" + c2 + "'"); + throw a.code = "MODULE_NOT_FOUND", a; + } + var l = t[c2] = { exports: {} }; + n[c2][0].call(l.exports, function(e2) { + return r(n[c2][1][e2] || e2); + }, l, l.exports, e, n, t, o); + } + return t[c2].exports; + } + for (var i = "function" == typeof __require && __require, c = 0; c < o.length; c++) + r(o[c]); + return r; + }({ 1: [function(e, n, t) { + "use strict"; + Object.defineProperty(t, "__esModule", { value: true }), t.create = t.visible = void 0; + var o = function(e2) { + var n2 = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], t2 = document.createElement("div"); + return t2.innerHTML = e2.trim(), true === n2 ? t2.children : t2.firstChild; + }, r = function(e2, n2) { + var t2 = e2.children; + return 1 === t2.length && t2[0].tagName === n2; + }, i = function(e2) { + return null != (e2 = e2 || document.querySelector(".basicLightbox")) && true === e2.ownerDocument.body.contains(e2); + }; + t.visible = i; + t.create = function(e2, n2) { + var t2 = function(e3, n3) { + var t3 = o('\n <div class="basicLightbox '.concat(n3.className, '">\n <div class="basicLightbox__placeholder" role="dialog"></div>\n </div>\n ')), i2 = t3.querySelector(".basicLightbox__placeholder"); + e3.forEach(function(e4) { + return i2.appendChild(e4); + }); + var c2 = r(i2, "IMG"), u2 = r(i2, "VIDEO"), s = r(i2, "IFRAME"); + return true === c2 && t3.classList.add("basicLightbox--img"), true === u2 && t3.classList.add("basicLightbox--video"), true === s && t3.classList.add("basicLightbox--iframe"), t3; + }(e2 = function(e3) { + var n3 = "string" == typeof e3, t3 = e3 instanceof HTMLElement == 1; + if (false === n3 && false === t3) + throw new Error("Content must be a DOM element/node or string"); + return true === n3 ? Array.from(o(e3, true)) : "TEMPLATE" === e3.tagName ? [e3.content.cloneNode(true)] : Array.from(e3.children); + }(e2), n2 = function() { + var e3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; + if (null == (e3 = Object.assign({}, e3)).closable && (e3.closable = true), null == e3.className && (e3.className = ""), null == e3.onShow && (e3.onShow = function() { + }), null == e3.onClose && (e3.onClose = function() { + }), "boolean" != typeof e3.closable) + throw new Error("Property `closable` must be a boolean"); + if ("string" != typeof e3.className) + throw new Error("Property `className` must be a string"); + if ("function" != typeof e3.onShow) + throw new Error("Property `onShow` must be a function"); + if ("function" != typeof e3.onClose) + throw new Error("Property `onClose` must be a function"); + return e3; + }(n2)), c = function(e3) { + return false !== n2.onClose(u) && function(e4, n3) { + return e4.classList.remove("basicLightbox--visible"), setTimeout(function() { + return false === i(e4) || e4.parentElement.removeChild(e4), n3(); + }, 410), true; + }(t2, function() { + if ("function" == typeof e3) + return e3(u); + }); + }; + true === n2.closable && t2.addEventListener("click", function(e3) { + e3.target === t2 && c(); + }); + var u = { element: function() { + return t2; + }, visible: function() { + return i(t2); + }, show: function(e3) { + return false !== n2.onShow(u) && function(e4, n3) { + return document.body.appendChild(e4), setTimeout(function() { + requestAnimationFrame(function() { + return e4.classList.add("basicLightbox--visible"), n3(); + }); + }, 10), true; + }(t2, function() { + if ("function" == typeof e3) + return e3(u); + }); + }, close: c }; + return u; + }; + }, {}] }, {}, [1])(1); + }); + } + }); + + // vendor/sgalinski/sg-vimeo/Resources/Public/JavaScript/Modules/sgVideoLightbox.js + var BasicLightbox = __toESM(require_basicLightbox_min()); + var SgVideoLightbox = class { + constructor() { + const videoItems = document.querySelectorAll(".sg-video-item"); + const isMobile = window.matchMedia("(max-width: 679px)").matches; + videoItems.forEach((item) => { + if (item.dataset.disableLightboxMobile === "1" && isMobile || item.dataset.disableLightbox === "1" && !isMobile) { + item.classList.remove("sg-video-item"); + item.addEventListener("click", SgVideoLightbox.disableLightbox.bind(this)); + } + }); + Array.prototype.forEach.call(document.querySelectorAll(".sg-video-item"), (element) => { + element.addEventListener("click", SgVideoLightbox.openLightbox); + }); + } + static openLightbox(event) { + var _a, _b, _c, _d; + event.preventDefault(); + const isShorts = ((_b = (_a = event.target.closest("a")) == null ? void 0 : _a.dataset) == null ? void 0 : _b.isShorts) === "1"; + switch ((_d = (_c = event.target.closest("a")) == null ? void 0 : _c.dataset) == null ? void 0 : _d.videoType) { + case "youtube": { + SgVideoLightbox.openYouTubeLightBox(event, isShorts); + break; + } + case "vimeo": { + SgVideoLightbox.openVimeoLightBox(event); + break; + } + default: + } + } + static disableLightbox(event) { + var _a, _b, _c, _d; + event.preventDefault(); + const isShorts = ((_b = (_a = event.target.closest("a")) == null ? void 0 : _a.dataset) == null ? void 0 : _b.isShorts) === "1"; + switch ((_d = (_c = event.target.closest("a")) == null ? void 0 : _c.dataset) == null ? void 0 : _d.videoType) { + case "youtube": { + SgVideoLightbox.disableYouTubeLightbox(event, isShorts); + break; + } + case "vimeo": { + SgVideoLightbox.disableVimeoLightbox(event); + break; + } + default: + } + } + static openVimeoLightBox(event) { + let url = event.target.closest(".sg-video-item").href; + url = SgVideoLightbox.includeAdditionalUrlParameters( + url, + event.target.closest("a").dataset.additionalUrlParameters + ); + url += "&autoplay=1&dnt=1"; + const instance = BasicLightbox.create( + `<iframe class="sg-video-iframe sg-video-vimeo-iframe mfp-iframe" frameborder="0" allowfullscreen allow="autoplay; fullscreen *; picture-in-picture" src="${url}"></iframe>`, + { + closable: true + } + ); + instance.show(); + } + static openYouTubeLightBox(event, isShorts) { + let url = event.target.closest(".sg-video-item").href; + const videoId = SgVideoLightbox.getYouTubeVideoIdFromUrl(url); + url = `https://www.youtube-nocookie.com/embed/${videoId}`; + url = SgVideoLightbox.includeAdditionalUrlParameters( + url, + event.target.closest("a").dataset.additionalUrlParameters + ); + const iframeClass = isShorts ? "sg-video-iframe sg-video-youtube-iframe sg-video-youtube-shorts-iframe" : "sg-video-iframe sg-video-youtube-iframe"; + const instance = BasicLightbox.create( + ` <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" - class="sg-video-iframe sg-video-youtube-iframe" src="${t}"></iframe> - `,{closable:!0}).show()}static disableYouTubeLightbox(e){e.preventDefault();let t=e.currentTarget;t.classList.add("no-lightbox");let i=l.includeAdditionalUrlParameters(l.getYouTubeVideoIdFromUrl(t.href),t.dataset.additionalUrlParameters),o=t.querySelector(".sg-video__image"),a=o.offsetHeight,c=o.offsetWidth,s=document.createElement("iframe");s.width=c,s.height=a,s.style.border="none",s.allowFullscreen=!0,s.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",s.src=`https://www.youtube-nocookie.com/embed/${i}`,o.parentElement.nodeName.toLowerCase()==="picture"?o.parentElement.replaceWith(s):o.replaceWith(s)}static disableVimeoLightbox(e){e.preventDefault();let t=e.currentTarget.closest(".sg-video__item"),i=t.querySelector("a");t.classList.add("no-lightbox");let o=l.includeAdditionalUrlParameters(i.href,i.dataset.additionalUrlParameters),a=t.querySelector(".sg-video__image"),c=a==null?void 0:a.clientWidth,s=a==null?void 0:a.clientHeight,d=document.createRange().createContextualFragment(`<div class="sg-video-item sg-card-shadow" style="height: ${s}px; width: ${c}px;"><div class="embed-container" style="padding-bottom: calc(${s} / ${c} * 100%);"><iframe width="${c}" height="${s}" src="${o}&dnt=1" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe></div></div>`);a==null||a.replaceWith(d)}static getVimeoVideoIdFromUrl(e){return/^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?(\d+)/.exec(e)[5]}static getYouTubeVideoIdFromUrl(e){let t=e.match(/watch\?v=(.*)&list=(.*)/);if(!t&&(t=e.match(/watch\?v=([^&?]*)/),!t))return null;let[,i]=t,o="?";return t[2]&&(i+=`?list=${t[2]}`,o="&"),`${i+o}autoplay=1&rel=0`}static includeAdditionalUrlParameters(e,t=""){if(!e)return"";if(!t)return e;let i=t,o=i.charAt(0)==="?",a=i.charAt(0)==="&";return(o||a)&&(i=i.slice(1)),e.includes("?")?`${e}&${i}`:`${e}?${i}`}};var f=class{constructor(e,t){this.settings=t,this.dom={list:e,listItems:e.querySelectorAll(".sg-video__item")},this.active=0,this.dom.listItems.forEach((i,o)=>{this.setupReadMore(o)}),this.settings.disableMinHeight||this.checkImageSizes()}static initDefault(){document.querySelectorAll(".sg-video__list--default").forEach(e=>{new f(e,{textSelector:".sg-video__bodytext",descriptionSelector:".sg-video__description",type:"default"})}),document.querySelectorAll(".sg-video__list--rows").forEach(e=>{new f(e,{textSelector:".sg-video__description",descriptionSelector:".sg-video__description",disableMinHeight:!0})}),document.querySelectorAll(".sg-video__list--playlist").forEach(e=>{new f(e,{textSelector:".sg-video__description",descriptionSelector:".sg-video__description",disableMinHeight:!0})}),document.querySelectorAll(".sg-video__highlight").forEach(e=>{new f(e,{textSelector:".sg-video__bodytext",descriptionSelector:".sg-video__description",disableMinHeight:!0})}),document.querySelectorAll(".sg-video--single").forEach(e=>{new f(e,{textSelector:".sg-video__description",descriptionSelector:".sg-video__description"})})}checkImageSizes(){let e=0,t=[];this.dom.listItems.forEach(i=>{let o=i.querySelector("img");o&&o.height>e&&(e=o.height),t.push(o)}),t.forEach(i=>{i.style.minHeight=`${e}px`})}setupReadMore(e){let t=this.dom.listItems[e],i=t.querySelector(".sg-video__read-more"),o=t.querySelector(this.settings.textSelector);if(!o){i&&i.classList.add("disabled");return}if(!!i){if(f.isTextTruncated(o,this.settings)){i.classList.add("disabled");return}i.addEventListener("click",()=>this.showText(e))}}showText(e){let t=this.dom.listItems[e];if(t.classList.contains("expanded")){this.active-=1,this.hideText(e);return}this.active+=1;let i=t.querySelector(".sg-video__read-more"),o=t.querySelector(this.settings.textSelector),a=o.matches(this.settings.descriptionSelector)?o:o.querySelector(this.settings.descriptionSelector);t.classList.add("expanded"),o.classList.add("expanded"),a.classList.add("expanded"),i.classList.add("expanded"),i.querySelector(".sg-video__read-more-text").textContent=i.dataset.buttonCloseText}hideText(e){let t=this.dom.listItems[e],i=t.querySelector(".sg-video__read-more"),o=t.querySelector(this.settings.textSelector),a=o.matches(this.settings.descriptionSelector)?o:o.querySelector(this.settings.descriptionSelector);o.classList.remove("expanded"),a.classList.remove("expanded"),i.classList.remove("expanded"),i.querySelector(".sg-video__read-more-text").textContent=i.dataset.buttonOpenText,setTimeout(()=>{this.settings.type==="default"&&this.active===0&&this.dom.listItems.forEach(c=>{c.style.height="",c.style.zIndex=""}),t.classList.remove("expanded")},200)}static isTextTruncated(e,t){let i=e.matches(t.descriptionSelector)?e:e.querySelector(t.descriptionSelector);return i&&i.scrollHeight<=i.clientHeight}};function S(){new l,f.initDefault()}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",S):S();})(); + class="${iframeClass}" src="${url}"></iframe> + `, + { + closable: true + } + ); + instance.show(); + } + static disableYouTubeLightbox(event, isShorts) { + event.preventDefault(); + const item = event.currentTarget; + item.classList.add("no-lightbox"); + const videoId = SgVideoLightbox.includeAdditionalUrlParameters( + SgVideoLightbox.getYouTubeVideoIdFromUrl(item.href), + item.dataset.additionalUrlParameters + ); + const videoImage = item.querySelector(".sg-video__image"); + const originalWidth = videoImage.offsetWidth; + const originalHeight = videoImage.offsetHeight; + let iframeWidth = originalWidth; + let iframeHeight = originalHeight; + if (isShorts) { + iframeWidth = originalWidth; + iframeHeight = Math.round(iframeWidth / 9 * 16); + } + const iframe = document.createElement("iframe"); + iframe.width = iframeWidth; + iframe.height = iframeHeight; + iframe.style.border = "none"; + iframe.allowFullscreen = true; + iframe.classList.add(isShorts ? "sg-video-youtube-shorts-iframe" : ""); + iframe.allow = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"; + iframe.src = `https://www.youtube-nocookie.com/embed/${videoId}`; + if (videoImage.parentElement.nodeName.toLowerCase() === "picture") { + videoImage.parentElement.replaceWith(iframe); + } else { + videoImage.replaceWith(iframe); + } + } + static disableVimeoLightbox(event) { + event.preventDefault(); + const item = event.currentTarget.closest(".sg-video__item"); + const link = item.querySelector("a"); + item.classList.add("no-lightbox"); + const iframeUrl = SgVideoLightbox.includeAdditionalUrlParameters( + link.href, + link.dataset.additionalUrlParameters + ); + const thumbnailElement = item.querySelector(".sg-video__image"); + const width = thumbnailElement == null ? void 0 : thumbnailElement.clientWidth; + const height = thumbnailElement == null ? void 0 : thumbnailElement.clientHeight; + const nodes = document.createRange().createContextualFragment( + `<div class="sg-video-item sg-card-shadow" style="height: ${height}px; width: ${width}px;"><div class="embed-container" style="padding-bottom: calc(${height} / ${width} * 100%);"><iframe width="${width}" height="${height}" src="${iframeUrl}&dnt=1" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe></div></div>` + ); + thumbnailElement == null ? void 0 : thumbnailElement.replaceWith(nodes); + } + static getVimeoVideoIdFromUrl(url) { + const regExp = /^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?(\d+)/; + const parseUrl = regExp.exec(url); + return parseUrl[5]; + } + static getYouTubeVideoIdFromUrl(url) { + const matches = url.match(/watch\?v=([^&?]*)(?:&list=([^&?]*))?|shorts\/([^&/?]+)/); + if (!matches) { + return null; + } + const videoId = matches[1] || matches[3]; + const listParameter = matches[2] ? `?list=${matches[2]}` : ""; + const autoplayParameters = listParameter ? "&autoplay=1&rel=0" : "?autoplay=1&rel=0"; + return `${videoId}${listParameter}${autoplayParameters}`; + } + static includeAdditionalUrlParameters(url, _additionalUrlParameters = "") { + if (!url) { + return ""; + } + if (!_additionalUrlParameters) { + return url; + } + let additionalUrlParameters = _additionalUrlParameters; + const beginsWithQuestionMark = additionalUrlParameters.charAt(0) === "?"; + const beginsWithAmpersand = additionalUrlParameters.charAt(0) === "&"; + if (beginsWithQuestionMark || beginsWithAmpersand) { + additionalUrlParameters = additionalUrlParameters.slice(1); + } + return url.includes("?") ? `${url}&${additionalUrlParameters}` : `${url}?${additionalUrlParameters}`; + } + }; + + // vendor/sgalinski/sg-vimeo/Resources/Public/JavaScript/Modules/sgVideo.js + var SgVideo = class { + constructor(element, settings) { + this.settings = settings; + this.dom = { + list: element, + listItems: element.querySelectorAll(".sg-video__item") + }; + this.active = 0; + this.dom.listItems.forEach((item, index) => { + this.setupReadMore(index); + }); + if (!this.settings.disableMinHeight) { + this.checkImageSizes(); + } + } + static initDefault() { + document.querySelectorAll(".sg-video__list--default").forEach((item) => { + new SgVideo(item, { + textSelector: ".sg-video__bodytext", + descriptionSelector: ".sg-video__description", + type: "default" + }); + }); + document.querySelectorAll(".sg-video__list--rows").forEach((item) => { + new SgVideo(item, { + textSelector: ".sg-video__description", + descriptionSelector: ".sg-video__description", + disableMinHeight: true + }); + }); + document.querySelectorAll(".sg-video__list--playlist").forEach((item) => { + new SgVideo(item, { + textSelector: ".sg-video__description", + descriptionSelector: ".sg-video__description", + disableMinHeight: true + }); + }); + document.querySelectorAll(".sg-video__highlight").forEach((item) => { + new SgVideo(item, { + textSelector: ".sg-video__bodytext", + descriptionSelector: ".sg-video__description", + disableMinHeight: true + }); + }); + document.querySelectorAll(".sg-video--single").forEach((item) => { + new SgVideo(item, { + textSelector: ".sg-video__description", + descriptionSelector: ".sg-video__description" + }); + }); + } + checkImageSizes() { + let highestValue = 0; + const images = []; + this.dom.listItems.forEach((item) => { + const image = item.querySelector("img"); + if (image && image.height > highestValue) { + highestValue = image.height; + } + images.push(image); + }); + images.forEach((image) => { + image.style.minHeight = `${highestValue}px`; + }); + } + setupReadMore(index) { + const item = this.dom.listItems[index]; + const button = item.querySelector(".sg-video__read-more"); + const text = item.querySelector(this.settings.textSelector); + if (!text) { + if (button) { + button.classList.add("disabled"); + } + return; + } + if (!button) { + return; + } + if (SgVideo.isTextTruncated(text, this.settings)) { + button.classList.add("disabled"); + return; + } + button.addEventListener("click", () => this.showText(index)); + } + showText(index) { + const item = this.dom.listItems[index]; + if (item.classList.contains("expanded")) { + this.active -= 1; + this.hideText(index); + return; + } + this.active += 1; + const button = item.querySelector(".sg-video__read-more"); + const text = item.querySelector(this.settings.textSelector); + const description = text.matches(this.settings.descriptionSelector) ? text : text.querySelector(this.settings.descriptionSelector); + item.classList.add("expanded"); + text.classList.add("expanded"); + description.classList.add("expanded"); + button.classList.add("expanded"); + button.querySelector(".sg-video__read-more-text").textContent = button.dataset.buttonCloseText; + } + hideText(index) { + const item = this.dom.listItems[index]; + const button = item.querySelector(".sg-video__read-more"); + const text = item.querySelector(this.settings.textSelector); + const description = text.matches(this.settings.descriptionSelector) ? text : text.querySelector(this.settings.descriptionSelector); + text.classList.remove("expanded"); + description.classList.remove("expanded"); + button.classList.remove("expanded"); + button.querySelector(".sg-video__read-more-text").textContent = button.dataset.buttonOpenText; + setTimeout(() => { + if (this.settings.type === "default" && this.active === 0) { + this.dom.listItems.forEach((_item) => { + _item.style.height = ""; + _item.style.zIndex = ""; + }); + } + item.classList.remove("expanded"); + }, 200); + } + static isTextTruncated(element, settings) { + const descriptionElement = element.matches(settings.descriptionSelector) ? element : element.querySelector(settings.descriptionSelector); + return descriptionElement && descriptionElement.scrollHeight <= descriptionElement.clientHeight; + } + }; + + // vendor/sgalinski/sg-vimeo/Resources/Public/JavaScript/main.js + function main() { + new SgVideoLightbox(); + SgVideo.initDefault(); + } + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", main); + } else { + main(); + } +})(); +//# sourceMappingURL=main.bundled.min.js.map diff --git a/Resources/Public/JavaScript/Modules/sgVideoLightbox.js b/Resources/Public/JavaScript/Modules/sgVideoLightbox.js index ab00a6d..6340bed 100644 --- a/Resources/Public/JavaScript/Modules/sgVideoLightbox.js +++ b/Resources/Public/JavaScript/Modules/sgVideoLightbox.js @@ -105,7 +105,9 @@ export default class SgVideoLightbox { event.target.closest('a').dataset.additionalUrlParameters, ); - const iframeClass = isShorts ? 'sg-video-iframe sg-video-youtube-iframe sg-video-youtube-shorts-iframe' : 'sg-video-iframe sg-video-youtube-iframe'; + const iframeClass = isShorts + ? 'sg-video-iframe sg-video-youtube-iframe sg-video-youtube-shorts-iframe' + : 'sg-video-iframe sg-video-youtube-iframe'; const instance = BasicLightbox.create( ` @@ -154,7 +156,8 @@ export default class SgVideoLightbox { iframe.style.border = 'none'; iframe.allowFullscreen = true; iframe.classList.add(isShorts ? 'sg-video-youtube-shorts-iframe' : ''); - iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'; + iframe.allow = + 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'; iframe.src = `https://www.youtube-nocookie.com/embed/${videoId}`; if (videoImage.parentElement.nodeName.toLowerCase() === 'picture') { @@ -221,17 +224,17 @@ export default class SgVideoLightbox { */ static getYouTubeVideoIdFromUrl(url) { // Match standard YouTube URL or Shorts URL - const matches = url.match(/watch\?v=([^&?]*)(?:&list=([^&?]*))?|shorts\/([^&?/]+)/); + const matches = url.match(/watch\?v=([^&?]*)(?:&list=([^&?]*))?|shorts\/([^&/?]+)/); if (!matches) { return null; } // Determine the video ID and construct the appropriate URL const videoId = matches[1] || matches[3]; - const listParam = matches[2] ? `?list=${matches[2]}` : ''; - const autoplayParams = listParam ? '&autoplay=1&rel=0' : '?autoplay=1&rel=0'; + const listParameter = matches[2] ? `?list=${matches[2]}` : ''; + const autoplayParameters = listParameter ? '&autoplay=1&rel=0' : '?autoplay=1&rel=0'; - return `${videoId}${listParam}${autoplayParams}`; + return `${videoId}${listParameter}${autoplayParameters}`; } /** diff --git a/Resources/Public/Sass/Bootstrap5/main.scss b/Resources/Public/Sass/Bootstrap5/main.scss index 5c5853d..b2c182b 100644 --- a/Resources/Public/Sass/Bootstrap5/main.scss +++ b/Resources/Public/Sass/Bootstrap5/main.scss @@ -1 +1 @@ -@import '../Modules/Bootstrap5/sg-video'; +@use '../Modules/Bootstrap5/sg-video'; diff --git a/Resources/Public/Sass/Modules/_sg-video.scss b/Resources/Public/Sass/Modules/_sg-video.scss index f69de8b..9d4d1e2 100644 --- a/Resources/Public/Sass/Modules/_sg-video.scss +++ b/Resources/Public/Sass/Modules/_sg-video.scss @@ -14,9 +14,9 @@ $basicLightbox__timing: ease !default; } $sg-video-icon-solid-play: "data:image/svg+xml,%3csvg fill='white' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath d='M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z'/%3e%3c/svg%3e" - 448px 512px; +448px 512px; $sg-video-icon-solid-chevron-down: "data:image/svg+xml,%3csvg fill='white' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3e%3cpath d='M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z'/%3e%3c/svg%3e" - 448px 512px; +448px 512px; $sg-video-item-heading-color: var(--sg-video-component-color-headline); $sg-video-item-text-color: var(--sg-video-component-color-foreground); @@ -62,6 +62,14 @@ $sg-video-screen-xs-min: $sg-video-screen-xs; width: 100%; height: auto; transition: transform $sg-video-base-transition-timing ease; + + &--shorts { + height: auto; + aspect-ratio: 9 / 16; + object-fit: cover; + + max-height: 900px; + } } &__image-container { @@ -80,7 +88,7 @@ $sg-video-screen-xs-min: $sg-video-screen-xs; transform: translate(-50%, -50%) scale(0.8); opacity: 0.8; transition: opacity $sg-video-base-transition-timing, - transform $sg-video-base-transition-timing; + transform $sg-video-base-transition-timing; z-index: 9; text-shadow: -1px 4px 27px rgba(0, 0, 0, 0.5); } @@ -148,6 +156,7 @@ $sg-video-screen-xs-min: $sg-video-screen-xs; &__list { margin-bottom: 0; list-style: none; + padding-left: 0; } &__highlight { @@ -477,9 +486,11 @@ iframe.sg-video-iframe { aspect-ratio: 16/9; } -.tx-sg-youtube-filters { +.sg-video-filters { gap: 10px; display: flex; flex-direction: row; align-items: baseline; } + + diff --git a/Resources/Public/Sass/main.scss b/Resources/Public/Sass/main.scss index 95032e1..f3d2302 100644 --- a/Resources/Public/Sass/main.scss +++ b/Resources/Public/Sass/main.scss @@ -1 +1 @@ -@import 'Modules/sg-video'; +@use 'Modules/sg-video'; diff --git a/Resources/Public/StyleSheets/main.min.css b/Resources/Public/StyleSheets/main.min.css index 8d39724..a909adc 100644 --- a/Resources/Public/StyleSheets/main.min.css +++ b/Resources/Public/StyleSheets/main.min.css @@ -1 +1 @@ -:root{--sg-video-component-color-headline: #0a293b;--sg-video-component-color-foreground: #174566;--sg-video-component-color-background: none;--sg-video-component-color-link: #15415e;--sg-video-component-color-play-button: #fff;--sg-video-component-color-link--hover: #061924}.tx-sg-youtube{margin-bottom:20px}.tx-sg-youtube iframe{border:0}.tx-sg-vimeo{margin-bottom:20px}.tx-sg-vimeo iframe{border:0}.sg-video__image{width:100%;height:auto;transition:transform var(--sg-video-base-transition-timing, 0.3s) ease}.sg-video__image-container{position:relative;overflow:hidden;width:100%;color:var(--sg-video-component-color-play-button);display:block}.sg-video__image-container:not(.no-lightbox) svg{position:absolute;top:50%;left:50%;width:40px;height:50px;transform:translate(-50%, -50%) scale(0.8);opacity:.8;transition:opacity var(--sg-video-base-transition-timing, 0.3s),transform var(--sg-video-base-transition-timing, 0.3s);z-index:9;text-shadow:-1px 4px 27px rgba(0,0,0,.5)}.sg-video__image-container:hover,.sg-video__image-container:focus{text-decoration:none}.sg-video__image-container:hover .sg-video__image,.sg-video__image-container:focus .sg-video__image{transform:scale(1.1)}.sg-video__image-container:hover::after,.sg-video__image-container:focus::after{transform:translate(-50%, -50%) scale(1.1)}.sg-video__read-more{padding:10px 0;display:inline-block;cursor:pointer;width:100%;text-align:left;margin-top:auto;text-decoration:none;font-weight:700;text-transform:lowercase}.sg-video__bodytext{padding:10px 0;margin-top:auto;margin-bottom:auto;min-height:90px}@media(1200px){.sg-video__bodytext{padding:20px}}.sg-video__bodytext h3{color:var(--sg-video-component-color-headline);margin-top:0;padding-top:0}.sg-video__bodytext .sg-video__description{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.sg-video__bodytext .sg-video__description.expanded{-webkit-line-clamp:unset}.sg-video__item{box-shadow:0 0 7px rgba(var(--sg-video-box-shadow-rgb), 0.18);background:var(--sg-video-component-color-background)}.sg-video__list{margin-bottom:0;list-style:none}.sg-video__highlight .sg-video__item{display:flex;flex-direction:column}.sg-video__highlight .sg-video__image{-o-object-fit:scale-down;object-fit:scale-down}@media(min-width: 1200px){.sg-video__list-item--alt .sg-video__item{display:flex}.sg-video__list-item--alt .sg-video__image-container{width:50%}.sg-video__list-item--alt .sg-video__bodytext{width:50%;background:rgba(0,0,0,0);padding:0 5px 0 20px}}@media(min-width: 1200px){.sg-video--playlist{display:grid;gap:20px;grid-template-columns:70% auto;position:relative}}.sg-video__list--playlist{display:flex;flex-direction:row;position:relative}@media(min-width: 1200px){.sg-video__list--playlist>div{position:absolute;height:100%;width:100%;overflow-y:auto;flex-direction:column;flex-grow:1;justify-content:space-between}.sg-video__list--playlist>div .sg-video__list-item:not(:last-child){margin-bottom:15px}}.sg-video__list--playlist .sg-video__item{height:100%}.sg-video__list--playlist .sg-video__bodytext{padding:10px 0 0}.sg-video__list--playlist h3{font-size:1.3em}.sg-video__list-item{position:relative;margin:15px 10px}@media(min-width: 1200px){.sg-video__list-item{margin:auto}}@media(min-width: 1200px){.sg-video__list-item--alt{margin:0}}@media(max-width: 767.98px){.sg-video .sg-video__list--playlist{display:block}}.sg-video__list--default{display:flex;flex-wrap:wrap;margin:0 -10px}.sg-video__list--default>li{width:100%;margin:10px;display:flex;flex-direction:column}@media(min-width: 1200px){.sg-video__list--default>li{width:calc(33.3333% - 20px)}}.sg-video__list--default a{box-shadow:none}.sg-video__list--default .sg-video__bodytext{position:relative;display:block;overflow:hidden;padding:10px 0;transition:max-height var(--sg-video-base-transition-timing-fast, 0.1s)}.sg-video__list--default .sg-video__read-more{display:block;width:100%;text-align:left;margin-top:auto}.sg-video__list--default .sg-video__item{flex-grow:1}@media(max-width: var(--sg-video-mobile-breakpoint, 768px)-1px){.sg-video__list--default img{min-height:0 !important}}.sg-video__read-more{background:none;color:var(--sg-video-component-color-link);border:0}.sg-video__read-more:hover{color:var(--sg-video-component-color-link--hover)}.sg-video__read-more svg{display:inline-block;width:13px;height:10px;transition:transform var(--sg-video-base-transition-timing, 0.3s)}.sg-video__read-more.disabled{display:none}.sg-video__list--rows .sg-video__read-more.disabled{display:none !important}.sg-video__list--rows .sg-video__image{-o-object-fit:contain;object-fit:contain}@media(min-width: 992px){.sg-video__list--rows .sg-video__item{box-shadow:none;background-color:rgba(0,0,0,0);display:flex}.sg-video__list--rows .sg-video__image-container{float:left;clear:left;width:40.5%}.sg-video__list--rows .sg-video__image-container span{position:relative}}@media(min-width: 992px)and (min-width: 1200px){.sg-video__list--rows .sg-video__image-container{width:35%}}@media(min-width: 992px){.sg-video__list--rows .sg-video__bodytext{position:relative;box-shadow:0 0 7px rgba(var(--sg-video-box-shadow-rgb), 0.18);margin-left:auto;display:block;min-height:210px}}@media(min-width: 992px)and (min-width: 1200px){.sg-video__list--rows .sg-video__bodytext{width:65%;min-height:225px;padding-top:0;padding-left:20px}}@media(min-width: 992px){.sg-video__list--rows .sg-video__description{-webkit-line-clamp:5;transition:max-height var(--sg-video-base-transition-timing-fast, 0.1s)}}@media(min-width: 992px){.sg-video__list--rows .sg-video__list-item{margin-bottom:25px}}@media(min-width: 992px){.sg-video__list--rows .sg-video__read-more{display:block;padding:20px 0 0}}.sg-video__read-more.expanded .sg-video__read-more-arrow{transform:rotateX(180deg)}.sg-video-lightbox-wrapper{pointer-events:all;padding:0;margin:0}.no-lightbox svg{display:none}.plyr .sg-cookie-optin-iframe-consent{min-height:410px}.basicLightbox{position:fixed;display:flex;justify-content:center;align-items:center;top:0;left:0;width:100%;height:100vh;background:rgba(0,0,0,.8);opacity:.01;transition:opacity .4s ease;z-index:1000;will-change:opacity}.basicLightbox ::after{content:"";position:absolute;top:1.8rem;right:1.8rem;width:2em;height:2em;background-size:contain;background-image:url("data:image/svg+xml,%3Csvg width='90px' height='90px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='%23ffffff' stroke='%23ffffff'%3E%3Cg id='SVGRepo_bgCarrier' stroke-width='0'%3E%3C/g%3E%3Cg id='SVGRepo_tracerCarrier' stroke-linecap='round' stroke-linejoin='round'%3E%3C/g%3E%3Cg id='SVGRepo_iconCarrier'%3E%3Ctitle%3EClose-Circle%3C/title%3E%3Cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='Close-Circle'%3E%3Crect id='Rectangle' fill-rule='nonzero' x='0' y='0' width='24' height='24'%3E%3C/rect%3E%3Ccircle id='Oval' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' cx='12' cy='12' r='9'%3E%3C/circle%3E%3Cline x1='14.1213' y1='9.87866' x2='9.8787' y2='14.1213' id='Path' stroke='%23ffffff' stroke-width='2' stroke-linecap='round'%3E%3C/line%3E%3Cline x1='9.87866' y1='9.87866' x2='14.1213' y2='14.1213' id='Path' stroke='%23ffffff' stroke-width='2' stroke-linecap='round'%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer}.basicLightbox--visible{opacity:1;pointer-events:auto}.basicLightbox__placeholder{max-width:100%;transform:scale(0.9);transition:transform .4s ease;z-index:1;will-change:transform}.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child,.basicLightbox__placeholder>iframe:first-child:last-child{display:block;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.basicLightbox__placeholder>video:first-child:last-child,.basicLightbox__placeholder>iframe:first-child:last-child{pointer-events:auto}.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child{width:auto;height:auto}.basicLightbox--img .basicLightbox__placeholder,.basicLightbox--video .basicLightbox__placeholder,.basicLightbox--iframe .basicLightbox__placeholder{width:100%;height:100%;pointer-events:none}.basicLightbox--visible .basicLightbox__placeholder{transform:scale(1)}iframe.sg-video-iframe{width:100%;height:auto;max-width:900px;aspect-ratio:16/9} \ No newline at end of file +:root{--sg-video-component-color-headline: #0a293b;--sg-video-component-color-foreground: #174566;--sg-video-component-color-background: none;--sg-video-component-color-link: #15415e;--sg-video-component-color-play-button: #fff;--sg-video-component-color-link--hover: #061924}.tx-sg-youtube{margin-bottom:20px}.tx-sg-youtube iframe{border:0}.tx-sg-vimeo{margin-bottom:20px}.tx-sg-vimeo iframe{border:0}.sg-video__image{width:100%;height:auto;transition:transform var(--sg-video-base-transition-timing, 0.3s) ease}.sg-video__image--shorts{height:auto;aspect-ratio:9/16;object-fit:cover;max-height:900px}.sg-video__image-container{position:relative;overflow:hidden;width:100%;color:var(--sg-video-component-color-play-button);display:block}.sg-video__image-container:not(.no-lightbox) svg{position:absolute;top:50%;left:50%;width:40px;height:50px;transform:translate(-50%, -50%) scale(0.8);opacity:.8;transition:opacity var(--sg-video-base-transition-timing, 0.3s),transform var(--sg-video-base-transition-timing, 0.3s);z-index:9;text-shadow:-1px 4px 27px rgba(0,0,0,.5)}.sg-video__image-container:hover,.sg-video__image-container:focus{text-decoration:none}.sg-video__image-container:hover .sg-video__image,.sg-video__image-container:focus .sg-video__image{transform:scale(1.1)}.sg-video__image-container:hover::after,.sg-video__image-container:focus::after{transform:translate(-50%, -50%) scale(1.1)}.sg-video__read-more{padding:10px 0;display:inline-block;cursor:pointer;width:100%;text-align:left;margin-top:auto;text-decoration:none;font-weight:700;text-transform:lowercase}.sg-video__bodytext{padding:10px 0;margin-top:auto;margin-bottom:auto;min-height:90px}@media(1200px){.sg-video__bodytext{padding:20px}}.sg-video__bodytext h3{color:var(--sg-video-component-color-headline);margin-top:0;padding-top:0}.sg-video__bodytext .sg-video__description{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}.sg-video__bodytext .sg-video__description.expanded{-webkit-line-clamp:unset}.sg-video__item{box-shadow:0 0 7px rgba(var(--sg-video-box-shadow-rgb), 0.18);background:var(--sg-video-component-color-background)}.sg-video__list{margin-bottom:0;list-style:none;padding-left:0}.sg-video__highlight .sg-video__item{display:flex;flex-direction:column}.sg-video__highlight .sg-video__image{object-fit:scale-down}@media(min-width: 1200px){.sg-video__list-item--alt .sg-video__item{display:flex}.sg-video__list-item--alt .sg-video__image-container{width:50%}.sg-video__list-item--alt .sg-video__bodytext{width:50%;background:rgba(0,0,0,0);padding:0 5px 0 20px}}@media(min-width: 1200px){.sg-video--playlist{display:grid;gap:20px;grid-template-columns:70% auto;position:relative}}.sg-video__list--playlist{display:flex;flex-direction:row;position:relative}@media(min-width: 1200px){.sg-video__list--playlist>div{position:absolute;height:100%;width:100%;overflow-y:auto;flex-direction:column;flex-grow:1;justify-content:space-between}.sg-video__list--playlist>div .sg-video__list-item:not(:last-child){margin-bottom:15px}}.sg-video__list--playlist .sg-video__item{height:100%}.sg-video__list--playlist .sg-video__bodytext{padding:10px 0 0}.sg-video__list--playlist h3{font-size:1.3em}.sg-video__list-item{position:relative;margin:15px 10px}@media(min-width: 1200px){.sg-video__list-item{margin:auto}}@media(min-width: 1200px){.sg-video__list-item--alt{margin:0}}@media(max-width: 767.98px){.sg-video .sg-video__list--playlist{display:block}}.sg-video__list--default{display:flex;flex-wrap:wrap;margin:0 -10px}.sg-video__list--default>li{width:100%;margin:10px;display:flex;flex-direction:column}@media(min-width: 1200px){.sg-video__list--default>li{width:calc(33.3333% - 20px)}}.sg-video__list--default a{box-shadow:none}.sg-video__list--default .sg-video__bodytext{position:relative;display:block;overflow:hidden;padding:10px 0;transition:max-height var(--sg-video-base-transition-timing-fast, 0.1s)}.sg-video__list--default .sg-video__read-more{display:block;width:100%;text-align:left;margin-top:auto}.sg-video__list--default .sg-video__item{flex-grow:1}@media(max-width: var(--sg-video-mobile-breakpoint, 768px)-1px){.sg-video__list--default img{min-height:0 !important}}.sg-video__read-more{background:none;color:var(--sg-video-component-color-link);border:0}.sg-video__read-more:hover{color:var(--sg-video-component-color-link--hover)}.sg-video__read-more svg{display:inline-block;width:13px;height:10px;transition:transform var(--sg-video-base-transition-timing, 0.3s)}.sg-video__read-more.disabled{display:none}.sg-video__list--rows .sg-video__read-more.disabled{display:none !important}.sg-video__list--rows .sg-video__image{object-fit:contain}@media(min-width: 992px){.sg-video__list--rows .sg-video__item{box-shadow:none;background-color:rgba(0,0,0,0);display:flex}.sg-video__list--rows .sg-video__image-container{float:left;clear:left;width:40.5%}.sg-video__list--rows .sg-video__image-container span{position:relative}}@media(min-width: 992px)and (min-width: 1200px){.sg-video__list--rows .sg-video__image-container{width:35%}}@media(min-width: 992px){.sg-video__list--rows .sg-video__bodytext{position:relative;box-shadow:0 0 7px rgba(var(--sg-video-box-shadow-rgb), 0.18);margin-left:auto;display:block;min-height:210px}}@media(min-width: 992px)and (min-width: 1200px){.sg-video__list--rows .sg-video__bodytext{width:65%;min-height:225px;padding-top:0;padding-left:20px}}@media(min-width: 992px){.sg-video__list--rows .sg-video__description{-webkit-line-clamp:5;transition:max-height var(--sg-video-base-transition-timing-fast, 0.1s)}.sg-video__list--rows .sg-video__list-item{margin-bottom:25px}.sg-video__list--rows .sg-video__read-more{display:block;padding:20px 0 0}}.sg-video__read-more.expanded .sg-video__read-more-arrow{transform:rotateX(180deg)}.sg-video-lightbox-wrapper{pointer-events:all;padding:0;margin:0}.no-lightbox svg{display:none}.plyr .sg-cookie-optin-iframe-consent{min-height:410px}.basicLightbox{position:fixed;display:flex;justify-content:center;align-items:center;top:0;left:0;width:100%;height:100vh;background:rgba(0,0,0,.8);opacity:.01;transition:opacity .4s ease;z-index:1000;will-change:opacity}.basicLightbox ::after{content:"";position:absolute;top:1.8rem;right:1.8rem;width:2em;height:2em;background-size:contain;background-image:url("data:image/svg+xml,%3Csvg width='90px' height='90px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill='%23ffffff' stroke='%23ffffff'%3E%3Cg id='SVGRepo_bgCarrier' stroke-width='0'%3E%3C/g%3E%3Cg id='SVGRepo_tracerCarrier' stroke-linecap='round' stroke-linejoin='round'%3E%3C/g%3E%3Cg id='SVGRepo_iconCarrier'%3E%3Ctitle%3EClose-Circle%3C/title%3E%3Cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='Close-Circle'%3E%3Crect id='Rectangle' fill-rule='nonzero' x='0' y='0' width='24' height='24'%3E%3C/rect%3E%3Ccircle id='Oval' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' cx='12' cy='12' r='9'%3E%3C/circle%3E%3Cline x1='14.1213' y1='9.87866' x2='9.8787' y2='14.1213' id='Path' stroke='%23ffffff' stroke-width='2' stroke-linecap='round'%3E%3C/line%3E%3Cline x1='9.87866' y1='9.87866' x2='14.1213' y2='14.1213' id='Path' stroke='%23ffffff' stroke-width='2' stroke-linecap='round'%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer}.basicLightbox--visible{opacity:1;pointer-events:auto}.basicLightbox__placeholder{max-width:100%;transform:scale(0.9);transition:transform .4s ease;z-index:1;will-change:transform}.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child,.basicLightbox__placeholder>iframe:first-child:last-child{display:block;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.basicLightbox__placeholder>video:first-child:last-child,.basicLightbox__placeholder>iframe:first-child:last-child{pointer-events:auto}.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child{width:auto;height:auto}.basicLightbox--img .basicLightbox__placeholder,.basicLightbox--video .basicLightbox__placeholder,.basicLightbox--iframe .basicLightbox__placeholder{width:100%;height:100%;pointer-events:none}.basicLightbox--visible .basicLightbox__placeholder{transform:scale(1)}iframe.sg-video-iframe{width:100%;height:auto;max-width:900px;aspect-ratio:16/9}.sg-video-filters{gap:10px;display:flex;flex-direction:row;align-items:baseline} -- GitLab