diff --git a/seperate single seasonals/Seasonals-Halloween/add_to_index_html.html b/seperate single seasonals/Seasonals-Halloween/add_to_index_html.html new file mode 100644 index 0000000..926ced3 --- /dev/null +++ b/seperate single seasonals/Seasonals-Halloween/add_to_index_html.html @@ -0,0 +1,3 @@ + + +
\ No newline at end of file diff --git a/seperate single seasonals/Seasonals-Halloween/halloween.css b/seperate single seasonals/Seasonals-Halloween/halloween.css new file mode 100644 index 0000000..3239b38 --- /dev/null +++ b/seperate single seasonals/Seasonals-Halloween/halloween.css @@ -0,0 +1,146 @@ +.halloween-container { + display: block; + pointer-events: none; + z-index: 0; + overflow: hidden; +} + +.halloween { + position: fixed; + bottom: -10%; + z-index: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; + cursor: default; + -webkit-animation-name: halloween-fall, halloween-shake; + -webkit-animation-duration: 10s, 3s; + -webkit-animation-timing-function: linear, ease-in-out; + -webkit-animation-iteration-count: infinite, infinite; + -webkit-animation-play-state: running, running; + animation-name: halloween-fall, halloween-shake; + animation-duration: 10s, 3s; + animation-timing-function: linear, ease-in-out; + animation-iteration-count: infinite, infinite; + animation-play-state: running, running +} + +@-webkit-keyframes halloween-fall { + 0% { + bottom: -10% + } + + 100% { + bottom: 100% + } +} + +@-webkit-keyframes halloween-shake { + + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0) + } + + 50% { + -webkit-transform: translateX(80px); + transform: translateX(80px) + } +} + +@keyframes halloween-fall { + 0% { + bottom: -10% + } + + 100% { + bottom: 100% + } +} + +@keyframes halloween-shake { + + 0%, + 100% { + transform: translateX(0) + } + + 50% { + transform: translateX(80px) + } +} + +.halloween:nth-of-type(0) { + left: 1%; + -webkit-animation-delay: 0s, 0s; + animation-delay: 0s, 0s +} + +.halloween:nth-of-type(1) { + left: 10%; + -webkit-animation-delay: 1s, 1s; + animation-delay: 1s, 1s +} + +.halloween:nth-of-type(2) { + left: 20%; + -webkit-animation-delay: 6s, .5s; + animation-delay: 6s, .5s +} + +.halloween:nth-of-type(3) { + left: 30%; + -webkit-animation-delay: 4s, 2s; + animation-delay: 4s, 2s +} + +.halloween:nth-of-type(4) { + left: 40%; + -webkit-animation-delay: 2s, 2s; + animation-delay: 2s, 2s +} + +.halloween:nth-of-type(5) { + left: 50%; + -webkit-animation-delay: 8s, 3s; + animation-delay: 8s, 3s +} + +.halloween:nth-of-type(6) { + left: 60%; + -webkit-animation-delay: 6s, 2s; + animation-delay: 6s, 2s +} + +.halloween:nth-of-type(7) { + left: 70%; + -webkit-animation-delay: 2.5s, 1s; + animation-delay: 2.5s, 1s +} + +.halloween:nth-of-type(8) { + left: 80%; + -webkit-animation-delay: 1s, 0s; + animation-delay: 1s, 0s +} + +.halloween:nth-of-type(9) { + left: 90%; + -webkit-animation-delay: 3s, 1.5s; + animation-delay: 3s, 1.5s +} + +.halloween:nth-of-type(10) { + left: 25%; + -webkit-animation-delay: 2s, 0s; + animation-delay: 2s, 0s +} + +.halloween:nth-of-type(11) { + left: 65%; + -webkit-animation-delay: 4s, 2.5s; + animation-delay: 4s, 2.5s +} \ No newline at end of file diff --git a/seperate single seasonals/Seasonals-Halloween/halloween.js b/seperate single seasonals/Seasonals-Halloween/halloween.js new file mode 100644 index 0000000..6803a9d --- /dev/null +++ b/seperate single seasonals/Seasonals-Halloween/halloween.js @@ -0,0 +1,144 @@ +const halloween = true; // enable/disable halloween +const randomSymbols = true; // enable more random symbols +const randomSymbolsMobile = false; // enable random symbols on mobile devices +const enableDiffrentDuration = true; // enable different duration for the random halloween symbols +const halloweenCount = 25; // count of random extra symbols + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the halloween +function toggleHalloween() { + const halloweenContainer = document.querySelector('.snow-container'); + if (!halloweenContainer) return; + + const videoPlayer = document.querySelector('.videoPlayerContainer'); + const trailerPlayer = document.querySelector('.youtubePlayerContainer'); + const isDashboard = document.body.classList.contains('dashboardDocument'); + const hasUserMenu = document.querySelector('#app-user-menu'); + + // hide halloween if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + halloweenContainer.style.display = 'none'; // hide halloween + if (!msgPrinted) { + console.log('Halloween hidden'); + msgPrinted = true; + } + } else { + halloweenContainer.style.display = 'block'; // show halloween + if (msgPrinted) { + console.log('Halloween visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleHalloween); + +// start observation +observer.observe(document.body, { + childList: true, // observe adding/removing of child elements + subtree: true, // observe all levels of the DOM tree + attributes: true // observe changes to attributes (e.g. class changes) +}); + + +const images = [ + "./seasonals/halloween_images/ghost_20x20.png", + "./seasonals/halloween_images/bat_20x20.png", + "./seasonals/halloween_images/pumpkin_20x20.png", +]; + +// remove commented out image array to enable test site working, comment out above images array for that +/* +const images = [ + "./images/ghost_20x20.png", + "./images/bat_20x20.png", + "./images/pumpkin_20x20.png", +]; +*/ + +function addRandomSymbols(count) { + const halloweenContainer = document.querySelector('.halloween-container'); // get the halloween container + if (!halloweenContainer) return; // exit if halloween container is not found + + console.log('Adding random halloween symbols'); + + + for (let i = 0; i < count; i++) { + // create a new halloween elements + const halloweenDiv = document.createElement("div"); + halloweenDiv.className = "halloween"; + + // pick a random halloween symbol + const imageSrc = images[Math.floor(Math.random() * images.length)]; + const img = document.createElement("img"); + img.src = imageSrc; + + halloweenDiv.appendChild(img); + + + // set random horizontal position, animation delay and size(uncomment lines to enable) + const randomLeft = Math.random() * 100; // position (0% to 100%) + const randomAnimationDelay = Math.random() * 10; // delay (0s to 10s) + const randomAnimationDelay2 = Math.random() * 3; // delay (0s to 3s) + + // apply styles + halloweenDiv.style.left = `${randomLeft}%`; + halloweenDiv.style.animationDelay = `${randomAnimationDelay}s, ${randomAnimationDelay2}s`; + + // set random animation duration + if (enableDiffrentDuration) { + const randomAnimationDuration = Math.random() * 10 + 6; // delay (6s to 10s) + const randomAnimationDuration2 = Math.random() * 5 + 2; // delay (2s to 5s) + halloweenDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + // add the halloween to the container + halloweenContainer.appendChild(halloweenDiv); + } + console.log('Random halloween symbols added'); +} + +// create halloween objects +function createHalloween() { + const container = document.querySelector('.halloween-container') || document.createElement("div"); + + if (!document.querySelector('.halloween-container')) { + container.className = "halloween-container"; + container.setAttribute("aria-hidden", "true"); + document.body.appendChild(container); + } + + for (let i = 0; i < 4; i++) { + images.forEach(imageSrc => { + const halloweenDiv = document.createElement("div"); + halloweenDiv.className = "halloween"; + + const img = document.createElement("img"); + img.src = imageSrc; + + // set random animation duration + if (enableDiffrentDuration) { + const randomAnimationDuration = Math.random() * 10 + 6; // delay (6s to 10s) + const randomAnimationDuration2 = Math.random() * 5 + 2; // delay (2s to 5s) + halloweenDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + halloweenDiv.appendChild(img); + container.appendChild(halloweenDiv); + }); + } +} + +// initialize halloween after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!halloween) return; // exit if halloween is disabled + createHalloween(); + toggleHalloween(); + + const screenWidth = window.innerWidth; // get the screen width to detect mobile devices + if (randomSymbols && (screenWidth > 768 || randomSymbolsMobile)) { // add random halloweens only on larger screens, unless enabled for mobile devices + addRandomSymbols(halloweenCount); + } +}); diff --git a/seperate single seasonals/Seasonals-Halloween/images/bat_20x20.png b/seperate single seasonals/Seasonals-Halloween/images/bat_20x20.png new file mode 100644 index 0000000..4ed37d5 Binary files /dev/null and b/seperate single seasonals/Seasonals-Halloween/images/bat_20x20.png differ diff --git a/seperate single seasonals/Seasonals-Halloween/images/ghost_20x20.png b/seperate single seasonals/Seasonals-Halloween/images/ghost_20x20.png new file mode 100644 index 0000000..18c7dc4 Binary files /dev/null and b/seperate single seasonals/Seasonals-Halloween/images/ghost_20x20.png differ diff --git a/seperate single seasonals/Seasonals-Halloween/images/lep_30x30.png b/seperate single seasonals/Seasonals-Halloween/images/lep_30x30.png new file mode 100644 index 0000000..26e95b7 Binary files /dev/null and b/seperate single seasonals/Seasonals-Halloween/images/lep_30x30.png differ diff --git a/seperate single seasonals/Seasonals-Halloween/images/pumpkin_20x20.png b/seperate single seasonals/Seasonals-Halloween/images/pumpkin_20x20.png new file mode 100644 index 0000000..46a77e7 Binary files /dev/null and b/seperate single seasonals/Seasonals-Halloween/images/pumpkin_20x20.png differ diff --git a/seperate single seasonals/Seasonals-Halloween/test-site.html b/seperate single seasonals/Seasonals-Halloween/test-site.html new file mode 100644 index 0000000..779c8c2 --- /dev/null +++ b/seperate single seasonals/Seasonals-Halloween/test-site.html @@ -0,0 +1,22 @@ + + + + + +