From b7080314b6cda83fd9e2e661b1baa29da330b4d3 Mon Sep 17 00:00:00 2001 From: CodeDevMLH Date: Sun, 22 Dec 2024 01:39:10 +0100 Subject: [PATCH] added all themes with img in specific folder --- seasonals/autumn.css | 133 ++++++++++++++++ seasonals/autumn.js | 148 +++++++++++++++++ seasonals/autumn_images/acorn1.png | Bin 0 -> 2874 bytes seasonals/autumn_images/acorn2.png | Bin 0 -> 2938 bytes seasonals/autumn_images/leaf1.png | Bin 0 -> 2926 bytes seasonals/autumn_images/leaf10.png | Bin 0 -> 3317 bytes seasonals/autumn_images/leaf11.png | Bin 0 -> 3028 bytes seasonals/autumn_images/leaf12.png | Bin 0 -> 3096 bytes seasonals/autumn_images/leaf13.png | Bin 0 -> 2847 bytes seasonals/autumn_images/leaf14.png | Bin 0 -> 2960 bytes seasonals/autumn_images/leaf15.png | Bin 0 -> 3260 bytes seasonals/autumn_images/leaf2.png | Bin 0 -> 3052 bytes seasonals/autumn_images/leaf3.png | Bin 0 -> 3201 bytes seasonals/autumn_images/leaf4.png | Bin 0 -> 2917 bytes seasonals/autumn_images/leaf5.png | Bin 0 -> 3042 bytes seasonals/autumn_images/leaf6.png | Bin 0 -> 2766 bytes seasonals/autumn_images/leaf7.png | Bin 0 -> 3277 bytes seasonals/autumn_images/leaf8.png | Bin 0 -> 3231 bytes seasonals/autumn_images/leaf9.png | Bin 0 -> 2954 bytes seasonals/christmas.css | 132 +++++++++++++++ seasonals/christmas.js | 122 ++++++++++++++ seasonals/fireworks.css | 66 ++++++++ seasonals/fireworks.js | 159 +++++++++++++++++++ seasonals/halloween.css | 146 +++++++++++++++++ seasonals/halloween.js | 135 ++++++++++++++++ seasonals/halloween_images/bat_20x20.png | Bin 0 -> 6017 bytes seasonals/halloween_images/ghost_20x20.png | Bin 0 -> 8708 bytes seasonals/halloween_images/lep_30x30.png | Bin 0 -> 10323 bytes seasonals/halloween_images/pumpkin_20x20.png | Bin 0 -> 4276 bytes seasonals/hearts.css | 144 +++++++++++++++++ seasonals/hearts.js | 124 +++++++++++++++ seasonals.js => seasonals/seasonals.js | 0 seasonals/snowfall.css | 8 + seasonals/snowfall.js | 106 +++++++++++++ seasonals/snowflakes.css | 132 +++++++++++++++ seasonals/snowflakes.js | 130 +++++++++++++++ seasonals/snowstorm.css | 7 + seasonals/snowstorm.js | 104 ++++++++++++ seasonalsWithClass.js | 92 ----------- 39 files changed, 1796 insertions(+), 92 deletions(-) create mode 100644 seasonals/autumn.css create mode 100644 seasonals/autumn.js create mode 100644 seasonals/autumn_images/acorn1.png create mode 100644 seasonals/autumn_images/acorn2.png create mode 100644 seasonals/autumn_images/leaf1.png create mode 100644 seasonals/autumn_images/leaf10.png create mode 100644 seasonals/autumn_images/leaf11.png create mode 100644 seasonals/autumn_images/leaf12.png create mode 100644 seasonals/autumn_images/leaf13.png create mode 100644 seasonals/autumn_images/leaf14.png create mode 100644 seasonals/autumn_images/leaf15.png create mode 100644 seasonals/autumn_images/leaf2.png create mode 100644 seasonals/autumn_images/leaf3.png create mode 100644 seasonals/autumn_images/leaf4.png create mode 100644 seasonals/autumn_images/leaf5.png create mode 100644 seasonals/autumn_images/leaf6.png create mode 100644 seasonals/autumn_images/leaf7.png create mode 100644 seasonals/autumn_images/leaf8.png create mode 100644 seasonals/autumn_images/leaf9.png create mode 100644 seasonals/christmas.css create mode 100644 seasonals/christmas.js create mode 100644 seasonals/fireworks.css create mode 100644 seasonals/fireworks.js create mode 100644 seasonals/halloween.css create mode 100644 seasonals/halloween.js create mode 100644 seasonals/halloween_images/bat_20x20.png create mode 100644 seasonals/halloween_images/ghost_20x20.png create mode 100644 seasonals/halloween_images/lep_30x30.png create mode 100644 seasonals/halloween_images/pumpkin_20x20.png create mode 100644 seasonals/hearts.css create mode 100644 seasonals/hearts.js rename seasonals.js => seasonals/seasonals.js (100%) create mode 100644 seasonals/snowfall.css create mode 100644 seasonals/snowfall.js create mode 100644 seasonals/snowflakes.css create mode 100644 seasonals/snowflakes.js create mode 100644 seasonals/snowstorm.css create mode 100644 seasonals/snowstorm.js delete mode 100644 seasonalsWithClass.js diff --git a/seasonals/autumn.css b/seasonals/autumn.css new file mode 100644 index 0000000..880df62 --- /dev/null +++ b/seasonals/autumn.css @@ -0,0 +1,133 @@ +.autumn-container { + display: block; + pointer-events: none; + z-index: 0; + overflow: hidden; +} + +.leaf { + position: fixed; + top: -10%; + font-size: 1em; + color: #fff; + font-family: Arial, sans-serif; + text-shadow: 0 0 5px #000; + user-select: none; + -webkit-user-select: none; + cursor: default; + -webkit-animation-name: leaf-fall, leaf-shake; + -webkit-animation-duration: 7s, 3s; + -webkit-animation-timing-function: linear, ease-in-out; + -webkit-animation-iteration-count: infinite, infinite; + -webkit-user-select: none; + animation-name: leaf-fall, leaf-shake; + animation-duration: 7s, 3s; + animation-timing-function: linear, ease-in-out; + animation-iteration-count: infinite, infinite; +} + +@-webkit-keyframes leaf-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@-webkit-keyframes leaf-shake { + + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 50% { + -webkit-transform: translateX(80px); + transform: translateX(80px); + } +} + +@keyframes leaf-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@keyframes leaf-shake { + + 0%, + 100% { + transform: translateX(0); + } + + 50% { + transform: translateX(80px); + } +} + +.leaf:nth-of-type(0) { + left: 0%; + animation-delay: 0s, 0s; +} + +.leaf:nth-of-type(1) { + left: 10%; + animation-delay: 1s, 1s; +} + +.leaf:nth-of-type(2) { + left: 20%; + animation-delay: 6s, 0.5s; +} + +.leaf:nth-of-type(3) { + left: 30%; + animation-delay: 4s, 2s; +} + +.leaf:nth-of-type(4) { + left: 40%; + animation-delay: 2s, 2s; +} + +.leaf:nth-of-type(5) { + left: 50%; + animation-delay: 8s, 3s; +} + +.leaf:nth-of-type(6) { + left: 60%; + animation-delay: 6s, 2s; +} + +.leaf:nth-of-type(7) { + left: 70%; + animation-delay: 2.5s, 1s; +} + +.leaf:nth-of-type(8) { + left: 80%; + animation-delay: 1s, 0s; +} + +.leaf:nth-of-type(9) { + left: 90%; + animation-delay: 3s, 1.5s; +} + +.leaf:nth-of-type(10) { + left: 25%; + animation-delay: 2s, 0s; +} + +.leaf:nth-of-type(11) { + left: 65%; + animation-delay: 4s, 2.5s; +} \ No newline at end of file diff --git a/seasonals/autumn.js b/seasonals/autumn.js new file mode 100644 index 0000000..5dfdecb --- /dev/null +++ b/seasonals/autumn.js @@ -0,0 +1,148 @@ +const leaves = true; // enable/disable leaves +const randomLeaves = true; // enable random leaves +const randomLeavesMobile = false; // enable random leaves on mobile devices +const enableDiffrentDuration = true; // enable different duration for the random leaves +const leafCount = 25; // count of random extra leaves + + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the leaves +function toggleAutumn() { + const autumnContainer = document.querySelector('.autumn-container'); + if (!autumnContainer) 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 leaves if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + autumnContainer.style.display = 'none'; // hide leaves + if (!msgPrinted) { + console.log('Autumn hidden'); + msgPrinted = true; + } + } else { + autumnContainer.style.display = 'block'; // show leaves + if (msgPrinted) { + console.log('Autumn visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleAutumn); + +// 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/autumn_images/acorn1.png", + "./seasonals/autumn_images/acorn2.png", + "./seasonals/autumn_images/leaf1.png", + "./seasonals/autumn_images/leaf2.png", + "./seasonals/autumn_images/leaf3.png", + "./seasonals/autumn_images/leaf4.png", + "./seasonals/autumn_images/leaf5.png", + "./seasonals/autumn_images/leaf6.png", + "./seasonals/autumn_images/leaf7.png", + "./seasonals/autumn_images/leaf8.png", + "./seasonals/autumn_images/leaf9.png", + "./seasonals/autumn_images/leaf10.png", + "./seasonals/autumn_images/leaf11.png", + "./seasonals/autumn_images/leaf12.png", + "./seasonals/autumn_images/leaf13.png", + "./seasonals/autumn_images/leaf14.png", + "./seasonals/autumn_images/leaf15.png", +]; + +function addRandomLeaves(count) { + const autumnContainer = document.querySelector('.autumn-container'); // get the leave container + if (!autumnContainer) return; // exit if leave container is not found + + console.log('Adding random leaves'); + + // Array of leave characters + for (let i = 0; i < count; i++) { + // create a new leave element + const leaveDiv = document.createElement('div'); + leaveDiv.className = "leaf"; + + // pick a random leaf symbol + const imageSrc = images[Math.floor(Math.random() * images.length)]; + const img = document.createElement("img"); + img.src = imageSrc; + + leaveDiv.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() * 12; // delay (0s to 12s) + const randomAnimationDelay2 = Math.random() * 5; // delay (0s to 5s) + + // apply styles + leaveDiv.style.left = `${randomLeft}%`; + leaveDiv.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) + leafDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + // add the leave to the container + autumnContainer.appendChild(leaveDiv); + } + console.log('Random leaves added'); +} + +// initialize standard leaves +function initLeaves() { + const container = document.querySelector('.autumn-container') || document.createElement("div"); + + if (!document.querySelector('.autumn-container')) { + container.className = "autumn-container"; + container.setAttribute("aria-hidden", "true"); + document.body.appendChild(container); + } + + for (let i = 0; i < 12; i++) { + const leafDiv = document.createElement("div"); + leafDiv.className = "leaf"; + + const img = document.createElement("img"); + img.src = images[Math.floor(Math.random() * images.length)]; + + // 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) + leafDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + leafDiv.appendChild(img); + container.appendChild(leafDiv); + } +} + +// initialize leaves and add random leaves after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!leaves) return; // exit if leaves are disabled + initLeaves(); + toggleAutumn(); + + const screenWidth = window.innerWidth; // get the screen width to detect mobile devices + if (randomLeaves && (screenWidth > 768 || randomLeavesMobile)) { // add random leaves only on larger screens, unless enabled for mobile devices + addRandomLeaves(leafCount); + } +}); \ No newline at end of file diff --git a/seasonals/autumn_images/acorn1.png b/seasonals/autumn_images/acorn1.png new file mode 100644 index 0000000000000000000000000000000000000000..c07e2cf5b72bfa5cfc0ab11d089d78e555cb1a72 GIT binary patch literal 2874 zcma)8d0bNI8a^1B(T3)fTDK7Oy4+-QNl;P(a!JSq*UUsX0*QcdM8wKm%B3{ht!|~Q zT54r!Ia!mAw{6Otez~+-S)=7>Hs*EA)O!H4b?&`?oOAfz=l$O0`JVG0a{Sp|(^2Lq z005@@cryawrx|>i7#hHLRno3Y0HE(F;)FqAEI$fQ8js`hr7<8*6)%Hv0C4wE$+)~Y z5W>WO0+ED@eRJ_AEJnnqVndx-1eS~r3Ps*(IT)m7b9m}F9+{8zSd4O4QQ!daAjHL} z;>8jLMMcGG<5J+?8Z#b?(Yio!RBRZ_A48YQL5wrb8Are_Mq%9L{8&mLW9j&2ctynu zAxK8SC;IH(eRiY`%%w+|D6*C2Qzj)4E%T_%)5QiV_|o2clEJrnRZ8zE8b zU*yps-?+o{eLsVWEBl@^i}l~#mx`tGAXpk86-)eN_7|x@aTr4s4@wj;=~OJq`71E|bC93~CrHypWl8yP zP{*$zA3EJ%E{zq5VN4O|wFKkCq`MHwE-nrvoUQ;3j})JHt^o7{B?3qYC)dUQ1cZwC zTDz_&tzFZgI8mdJV2KE(grv=@g~C2zaFb3>_|Ni$e;BB@swY z4n&dziO3<6DMTWLxac1QB88wUP3te^i(-@im$ydK7dqBNbqZ^BWz+zk`UCK?Z?ZGyjOrSUt$6LdHw-~MH{<0Vy`u`NO=wto5EngM$ z4bS7nxZ^bw;3HA)_;0AxIea!U;3jl7coe}i4L>o|;KjsP1SRk+l*2h;0l)`-Kzm1!GepCvGx<@JvBin-+G z7u07sYqNaRD#MG;HAQ_HrC#=tPUL`R((P6L(RvGe>KhyI`5$7eOOI}N`SQZu(%QgF zTZW8N7M?ZT(Pr~x6MMbrgX z=+JLR)qXLN?+Q1Y=${=+9X@f*t9IvWrH9ic^Q$QyZOY{IEb5}f1P`PDQgI%>5yPAFPoEZKml_m_j z{Cf6`8C=gsx0ZE)=^jD--I63V{Pmh5^A1-4z-(*Hh42Zq>H`4eEFT7qSpY2OqK znygGoZ6|lC1#-i={nrew&Dv%b_)S%p>_$x*%T!OxGo;lQrCJ=y!mP@ODw}V$0J`f` zW>dc7NV-o(F1O6Cv+>qQLL;^P$;qq~L2Z5^&b4p<^!A99o~j|_VD{i(Ue;1uRFjQ& zd;YrAl*<)o9-inuQaCxtVaiDGp~!;Tws-)m}}fr(RiH zrJh?DgT9T#6#>XnC@aLyr1M5!)Tyx4w@q*FuMU1OaA~CYm*wZR|CyxBWUvCDY*xCs1`tuxWKhFr5(YrP#E_!IMXVj90jGD@Q z>JR0%@7*?38$Hdu(qDDNlzggX16oZN-a)>%w5}Js_x;Yxn>V_;Xdd!i+Kz=wc8=Ur z-K%W7UNr+f`X+3{q&Y|o_PPlnA|R#O&gH79;_7YGe2n;{Jra%f1eq-r*Ah~rXblqM ziiFdFK>*RV(vXqhs$Xty@OFTY^Ro^Ei~@a(EqX_`FT-q&eJ!i#T^oCcXm!`> zX+weQ4@^RAxZ?e1Upl?XN1xIX*<%iPuYciCQ^vQ%5_WU;99D*yJNntUQfa-#wn*{)=UaAm2wP=6dE1xW+jBHT*gP<>xAw>9o(L;P zq)|coOZDIEehjXTM3PNuD`PO_(EIu8a2B2F>ul(Kt?I?S$kcONy$4S||0Bn&;E@fM zzX_GT8S(=*8ra_{*jHyOGhDXO<8fc&g14M4f5g8kbdy&r9{P8@Y8P}OZoN7907D`w zx7~=!yvf*X)N2sTl+)47R#a^1>sc2La4M8W%R3vl#NC+lWUpkPbz8fi7%A;tCs%Oh zXZ)!+VK1A^i0(yONftgB^UHsHA#$Ie&CTPFFWM^JyAFFua&JiFLz7)Q+%J&@3nT(Xx)XD+4jd~C0{>y=XR8`e>mMB_j-(c zlyf%WUC*gqvAsD%Y&P&Tt9vXYrF!|w{NC1icZ<8M1BOamhRZ@*Lvdq?9Tgqno5ldZ Xc==A|%Vqa9e|deFY(~YB==A>p>8@6Z literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/acorn2.png b/seasonals/autumn_images/acorn2.png new file mode 100644 index 0000000000000000000000000000000000000000..226e779f4eed1af40ac0f71ee077c87271851586 GIT binary patch literal 2938 zcma)83p|s1A77%vQJv14(5cpPDYBcnY}pYuSxn6RlFasu#rDiLhE7x{O1V^SX10@?(2Z(KV1OJXoeBB^$WRUs!eKB|vrrzL5da9` zzJMQ_OGHf6Tt&dyOd`V7kcy`AECGMEbvPez47YP)gaKG5}vx32w?~vIsPi)kkM&MMU@u zg**ZZB@&5{A_FAI_d{XucsvS?MPae}kcGY=j4Pyv>T?C_Bq3xmNPvLBXY+(?kPDZ@ zr2B%wLLveI;qZ^afl&76=v=|a_8}rr5(I@oqETO(^ZY>}DDVe)a}|B%GY5a?C}gw# zA&&(4&K#oe#~DKDydN1;ssG)a!}+QWfsh;m5%H1KuUhz&K;RU{15h+T00#3J067HU z3fD=QknlpV1Oq|7BP0!gh`@Z_wr7U|fo>!=2jB`I(uoMH;WwcBm!QmZjxi$;L2u7 z_hm&%9V86~21^v;%wToO^3q6)H!sc8={($6cKedK-LZbX*5EQ_Ocf ze=NonC7A%9h%!ZeN2Sc*i;)2}A=`sS5j4|Kb3+YU%#B5W3(Z14H1sx{e)|jto41z@ z3H3XH!eHx@f|IIjEX|i5F#AR8bW-d>H#hk>mpK3EoWtZM zY;dt(%BfWnE0-@nuVC&Vf64BGf9?PtrATVJgWdG#Lx^8@rh?7-yfgo9S!?ab_webR z@bd5u>OI&!k{@Mto=$chj&fW(+B>{Xg;hJ1Rxz4A)8&zi*}iu_Yaoc+$!|1h6s*K| zJ|hkwwbYL&?O0S}Se5f4s&I?07Y^?*03NNd_mSK9cjLV#)RFhTT7`KrgM*drg|)Q0 zgm=q!Z7fqe)~)mKklh~kdy{k^S@HLu47AIZEb(3dkTc((;(w5Hzv;|$*^qO|Zl5Op z!RevAa9dxm*J<(pQYf2^oGH4orS|w}h#9U#eV2-!|Ix3@6pLcZxTd!FavXWwI}ySnJ)M6CrNTyfv#HKBVk-qLbchnsv9H zubuzMJ0aZ20i6sK4SEdLM<)dQTG6D3&&XaotMPdp=oBf0p^Rw+LrowHO23p*-Yt}8o_g#B6)eCDPxsvkMA=+*Vfv8zh?*{h2D z15CCpiny{MQNOkHRuJV1K?TLi$R1yl-BY*Q^t@IEjb?D~;G3#P+k?Vi<$5OI#4mNC z0cA3L@6e6eXhnA_f(aH3C3Lo*G#l+&4GMl&Y-U(!j$YWZrV{Lh_mi9#r}YSl@yTlP z*4ml37Fz5vOnYs!q`V5>wH|$WyV>!V2E>T!o1EFHB%tq*x#iuq`P5}LcO#e8)x}sH z(}?ug(WWSYPD)Hg=wohR1L<+6^TtZ7a#QUNnZGC z$k?4*u{0H>#DZqrMLatDh*iDIG4IBp(yeiF<()!x-9}{?I|8(Ma?z7TOBvB!Kh)ga zVq^|K!P~lhW$qegyP-0<~u~SkXpED0@+oKvH-{I;|nv~-fKN*|LO|RFc#f}n;dGgB{j!8((5i7aM$`1aA zs9eTVV|(U?hlhGp56P{F*R@yaX`o-ZXI^vgcp@nzFYcOAWp;gAVe!KWdji(Vu>$T%4N~2ysN9T0Unw$(?DC!HzGmeZnacW0* z`nyX9x;%P}HS4&-`G4ea+B`z8J3RDxP?D%`aY&W2@sB^f#2q!9*(c{)`$+ExR$Xa9 ziSoUwdxvyZdsI1|6X|;|6f58EC@l{@`^YW*cynV)K^m;+@T$n9Cxw)*t0p7USIM}p zZJt!f=YDH#B+jP6Osmd;vgttoP>W_sgo)=`IN3fBXFP_vFF=S-CxUBiSu;@$7ddwG z=e@lTwk)VVyLv~B`ql#n#4Wq?@)Mp;C*o3z(LWdEy`TlvscoGx`_Pe%Cc5 q@ix%%lk=QnJHvDQn7{4zW)HvprJ1S literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf1.png b/seasonals/autumn_images/leaf1.png new file mode 100644 index 0000000000000000000000000000000000000000..49c156233be8bfc26e29d18010b65c3fedbecab2 GIT binary patch literal 2926 zcma)8c|cP67RC~DO)F}wv?1JDWOWOKOo5aV1hK*;72zrrn}EBOS(&J1+NL%oT3WWf z%Cvk@rrBmqi)C4vW#cm1D=VkfZ7yiG&U^2V3;fP^*6)7zTvSYkx0&%YV+aIdM)RTg zgWtb`7tGKA{EQKHe1brr^MwH%C5P@y;7P?OE?*h}pyI_c5QjjB9`Q0RZzZ6FM*vYm z2?^12rWyek@=1tgE_4iCMg{~zpF}ypPGkh|5?Au@e1yk*V`4l3Odtl7TzI@#BvBCJ zNeEqD0{B~NMkC-l7v)M4f+bB!obzlo8PA zxVSh}oD)hak3wVdcsv?|L*sBr&;zMRkSMwFNQuHmn_@Tz1yJzhLYY!1mB6(*xe?MB zB?*B5arj7bAYS+-yF@WEK1c*wi=eS64Ek$#nLw(PDg;v5Xh+|~jKV(zDut2%P)CdW z;11IF^9u1?+0UHm^#ATI7JoB_LP?DUi5MaEn-M-2Py{5%0JJ}#kjBV)05uknC~b61 zXn7%!r6Q@E4N3zbA+TS}Okq4A;!uQQK%xLiCn21^2LrzXaTs0XC~3o4=~6zJ)ag5j zMkX`m(nz5Q#1#JCUT_+f?25&^x*~C?;Tl>V2{bV`3h)IaQAz;`F_QlauuRC;+DDqw z*|h_TVzdfbA`ya=;B<9$5a$aC`D5xCLNqbm(Oj4nk$0&YS%xbnoY<(D83y|qG6ra#CN z0-2Q)lT)>r>}j#lW0GBQPWm_wM_;v6C0MWCM6ENqi%>mnv_Qg+_RQ{woi=8Xn)i7X-GzPkgZ5&VuT6_=jixrrYn^Hp)A5aMq*j#O z)Xm0WhG$%=)UVc+dCv)P#gCK3|c<4rtjcoZ_W1ZSP$p3(=H`>G{qL3QO_vi`gOP}7>eq?Lh5=DZ# z={@6FP4qNBdQQ*Okjm1C(mC1V{`hb+uxqc&;B$*lCa-Qw({8TXdo)-T`k2Jd9{0=5 z(~|1IORpcyI(MG~%|kBS#li%d=GBy*>OvZXn}yW$jDMrpTR-k!*?o7!>xPb!R^O{3 z>xCby6R|BOVJ2HTF7(arqM7aqJafyPv-mHVbyMiZ)n@&#DqcTJc7OWu`qER8sE}z% zR-V}F=~K}y26xl;z^6~NpWx$Fl47=AeBt_g^8f~MYh`usqmP-v)3&TWQ8DoL#kO;a zj!SH(iw>qZvS_wY8hpouhKV>MSU3w}lco3g)cC^F9tEf7J6^~krUyk=mfkXE+?||6 z|9wuX0qfey1rEn6rtVhXIne?yNHGxD&PmM@bbjy*tG^nYFrzGE&E49V1$M_5sUBB$ zaO&@-XO&^LtNn|}$^~<8BUVssSYus^r`#1BVrkwe|Gk$mF}XUUd^U3m-_!1jelYza z2RBNC?Ps*zn~m?ZDiCvk(#&e zxe+PW-%f2PChD1~4A|bxnJZKpqg6n_+`>T#;V8LA&ngjbgj+UwmxYi0Ou7E@mz+jx zI=?pPUG12R18p1jrHc%q=XukQwglkLbKKSxhxt9Y0iBR{>{iTWeOu_E=84>Qo%vRj;uf{3!^R92CVdEK;riF-H+N?TMZjy8g!0tcoKgWHVHOHz`hv!vWa1h>?*iy za?Frye}n%_AWJ#xha!4ZB}XP7DcxyM>tF50;_iZ}-2E?y#$@e2S!{2pvdv*vY`xRE zKKr>t7^RmTj7ob}0yz2|t!O#4`~t*S^T1(OS{)Ju{et>dKGq4IA#G3d2Oz zw+qaBh^tmCi8uLB|1`Y0Sv0oBFbldcvnB$QMa{Zsy2$k6;mj)0&0q4v3fc;nzv{O; z{HqztZ_|gBHocv85o^-lT;7%2Doxs7-CT4kGv<98H35yC?3ByN!tvH7OgS6%>54Da zYFmQl&o?F)GST#*!Rl-6`Hhdy?CiVt;M1& literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf10.png b/seasonals/autumn_images/leaf10.png new file mode 100644 index 0000000000000000000000000000000000000000..d6b35e8737be1f1272e4e5b1fa16853d604ed04a GIT binary patch literal 3317 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 OE4EflM%ilrxc>kGl{S9> literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf11.png b/seasonals/autumn_images/leaf11.png new file mode 100644 index 0000000000000000000000000000000000000000..a737474e9397f26538b0025626babf26782b78fe GIT binary patch literal 3028 zcma)8c_37K8y;Jh6p|&~dpnIR6=tzyCPR~92-9R&lreLR!7R-T21T@>(j-!nt!%}o zG^rFRNea0aEtWzhOIPZ;-E?jD%+TKbzVDB7&ivlz{k_Zcd(L|%iA*9cP|{I?!C(s< z9SE+_Qxm$h6y`y9mBE^97);KZ;qJ}%c5%j1*-R4(jU51*2$&oQhrz6D1RM%A1mpt& zAf3U&!AGyvzySsg2lp~}LAr2k!61f16c==hBDqteLZ}!T+{RkTN`Qp|FhM>A5HLeo zJgfi*m&CgFvDYXtXipVa$tU@hJjh7Ef0kVm1Z= zpx;7{wzgz0JCG3yVLVsjdce`n)&hmGurNlO%oZT#5$njL&_QRAMdt@W$!CLn2D}(F ziG8*xiCx@aXqZ?b9xMh#$rq6KXAB2lgGPLj#^;9+bZA%?NZm9FpF*JUp-Rz6w3#sq zZHz{_qcB*MCDznzH4=qIA|;JW{Mj@{VC4Vu7AqRCg8W@vunr6!pUsVwm}X_}25z5S z%`QV35`BvmF7~HT#ogiH94?y{Mg?h-)Dr!RQ64*xA3@=Qcsg{zI5<8qkOA=!36RA? z2hac-dMVAn-VzZ6icj`qYe;t_5^HXOMO)0ZhWKGI63P8*F|+9ZQ_Px=#msK`rkL+| zo-4)*A%6cq5@m(>j>=hwF9rtG#HU!c;?qzBSy$#!+~+u=#Q4^|+K9e)0HYrO21 zo1SDZ5HQhv!|SYHu^xw+SovYQ8T$_(KO( zdrEa@QDNnw8|8Ax)|eY#Q1R;eb*yw>1;^*Y{w>e83)UuF0tc&hr$5-xa(3b*4j<%p zeOPnhLdv@PYahnIv@__nt;G>h(6>vG^VmQ-rX{J@6qOx zEH91v*p|-dno-O^Orc}@20}aGE+BIt6>FH~jaSvRRFh90T;@+C@pEJ2a&__K{AUiY zMdnnORftUp;>pBRs?Ct* z&;{Zc*MAK3y6oo2Bn-iH4y0xkWzp^~9f=)Bdd~3vdbVx#3~{)ubgR$nqN0UbtIyeX zN8B@~TKa*P*Ehd&J+`gvVQA!=sKRJgeq`mToG8rBYUM7ifrMt2me{vfYt(myJ@2Z# zUsGNqQk(iUzDZB*fs7q&2`3S@q!+Jz^UpP{f0&X!WDz6#nr_GT>{uMCx&~}Nnkwz2qppw97ox^Wjli z%c6ler3)+1_z{Db|ANtoCtGiIQNLx{_B#1o&*bgB%?Z6^f`5hniA&U}x}U3T2=kuG z8&Xp>YBPzsDhm=0DD*qeR4lsIvm^Qrlex45=Y~`^PR|H;N_|$cCML2^9j0$%siu~BB-Kq=kaD+_`Yve(eSct3%D^BkumKIYW~ba+ zg|u~)P1Js*bJgjN@R(+;itZj2#j}SoqGXw;JXU6urHzuTly;@xUT?d~k84&=+G6ZygkHu%9Reu0GL)NyT0AP z_^5}|@b!R$1H#F9XoG^3@K%)1h(lz48nb?CqHecEF-cVr<{-VtPytVH`YFwMFgW)u zUO}d>0&n5}(yT4Jd!d==-c;7X&Lyj`q^4VY#tm!LUu<4{I-{h68!|l|)aY=uoIR+i zUY{3-ymyg)^@D!Qd7z^HN-5Dd0w}JgYN{I6(o#J4y}2kOt?mt!yg-xni3RK8^bAMV zDX&!?vkg$7)ym(QxS>RlO(c2RJ3XJqxW!7vD6*@g z(aK}l#rT679qSBdtZJ{vz7)+2mNvHe3IE8_>3`Ia?s(X#AS3*R6}fXmw(JIbpEwGG zFK?gCHyUL`6I($c&M;5u?OJub=&*563B=fBSp*@7pFCY}y0^6$;t6^;FdSR995# zJO^CQ683g3-M^tX@4^m|N&S{<=UisE@7dShq283IOZAkTa6c1+N1aT&K~%*vPSOr# zI&^IB80owtY+Z4Q_U^Bz$$22g_v&Q9(QP}2Z|~kB+$%>0FPgp~f6@DvT_hjA zLYRjrPCK9>lkJ|>-605mRi5{E>)5F1-POtBzLx6M6 literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf12.png b/seasonals/autumn_images/leaf12.png new file mode 100644 index 0000000000000000000000000000000000000000..6d826f56f5dad8a3cae4014931d414c46798e487 GIT binary patch literal 3096 zcma)8d0Z3M77hwpHbJF|RDCgQB9e{G1Y!&%2udOXvPeWiGFgOVViLoqpny;oSwuw? z1zA*3i+~m*C^ZPUA+(BRDIloWvJ`y+{t$sTNvKP;@4Y`}Cii^bJ8zm`$_z$?sz81M>1GoFn|o_3n3f^b0mff z8O#ts0uKf_JOKeQQeBIH^H>CguPqf#6*>c4o@=BC@QS2)Gb2NoI2MAqUdu5Y4>{li z5(Ye+A1V;z!wCqbUp(|%VMZa~N{S?efbgSwz@0%60JlZjBGHKTT5v}Zi;edryUcEe zRs;lBA`#+IsIagwWSBJ)6md`(91e#Sm8qDgA9n7BA!sf z0|jt}Pew4fM?yd#ARIpH90=!q^ezz3mJbPmQXnV{5{>$lF64p|P|O8|A2RxE&jc|6(h88tw@3sZ_ixPb>jN5lWM) z(Y=7(s+DRP%2Rf@qQ@0{22)WV0U;EDtUXMCr7ThT1}IQ5$d-gLL;#5c9WenxVzYUW z5)p6@MXSTHa4hs%+J3$zj0-5wcD6LMHyVw%wZ~)aW=lhTH5p~o{bMpJ^#4i5{;y6d*1)~3 zVKB7=Jg8B>Xiykzb>^N-*=A>wej;(PX+h@q^ZoqPlYEl6@%e`+x3wQ5lAgAjpt3Wb zy$+0354h#yq0g_;n$o`V?L`gJR`qh)C2nCa4y8%H{Q&FGGcDz`ozmF6y0~bpVU;UK zv^}U}guXp+cSmyDA7|rSE;1;-FXOyc4RpLT)@9ecJ$`i{Z}Qjeg_s=&64<@FDXk*8 zwOsriuJt*g7iqdIO>5^j)wZ(yS8*j9*U)WnTYJH*s~$mf)(*=b-bSUp4>m0+KKSCr zwO>kVJa42=EQ(rNX?Uc~ygP-qpZ9)U4scj=ua31@rJi2kJb-fQ{Tb2p9RIu9SUwi{ z<+NB6+;0W_#gXp8^wHy~1{#$!F_Wc@8*7dZNQpK#j2fbdZPGJWn1(ye6Sm?t2DRy& zT@&q0!zulJ=g!K~ek#|28wRhajc4li+{f#w$hTW^1FCWgXo8lDp zXLJpfPND60lp{I|gC%`idbUpwKjV}wJ01fUieCTZ^lZ#rK2?bzmORK>BX-z@Yq@j7 z46JqT8GA}k!|sbF%hXd3jNi<#M=oz$7#MY(@n-Pe-Z>GR3O?=4{nC!4bH4tvy(wd_ zH`ssAE~>3=pYAgm&vkg+YCo{!;3MrxjXGMnv~>5REap`fMMv&6448F2 z-tTIjv)m9f)wg_NbI=qLZL{L;7)~~I_uPJU*XO!cw+LA=cihh2Q?Q?d!q?0 zp}9K+C$5Xk9uo)s+IrbJhQlV6Y6lj_9*Z7cGJLJxWZnQA?K*E+OCV(;s3@_%MQBui z_@pUsRR1g~U@Xi`XQZzQ)1@A2SnArm!KDpeLcqKT?8!bAun~+0J{h{%>E`g0F zFI;(MVvS+D3boc^4|%oOxKzgt(cn@}dt7k5l|g|Sd4rTGyx*UEIqQV=om1}tC;R>R z3&-kK@ze~sD?8(Lcur3{&g8bFQF~19=)}F!hm#)ruV4I2(Quf2&3&3>!r*gs&JLZn zhO2R*Jo60Ok_3s9p`&(A^~%aXy&+2Gy=eFI#*fGk4x`3&_{E(;KKqRVWOFU53|$s2 zT2h=q2jS*+1*@E{2}mK$=z|>(*BCJn@oQ7r!-z))aa)XMP}kgN&~>aJfO@eSp!r(f7{mKL-JTI73hPV{*5 zs~44ATku=Pq6&)PxdWSOyD^f}R2>ig;onZ^e6L^Fp!ot-^6%0nm$vP;FPaf&x?|~$ z?U`Nif=hLKLhuRg?os2Sg=&R!Jn2>aH+{vU7mPXGKO8E0Xw#GUuB5N^EoY1K!|Yrd zuW|0NWdlBCrhW)@u`yjC)Z=^{c!Yqi$cQ2(+M$`<^&AR*QySgne%heNQIP_9jo|5??$1Ke{c$l{SU73?2iBd literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf13.png b/seasonals/autumn_images/leaf13.png new file mode 100644 index 0000000000000000000000000000000000000000..606eca0ad3ffef9971937f0c24e8b5453bcfc8ef GIT binary patch literal 2847 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 QSNxH7bM|s7TNk$NKPSwY$p8QV literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf15.png b/seasonals/autumn_images/leaf15.png new file mode 100644 index 0000000000000000000000000000000000000000..85c5b81e895b4b8c11c170180ad0f1d250ae24d8 GIT binary patch literal 3260 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 EFP%Zp&j0`b literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf3.png b/seasonals/autumn_images/leaf3.png new file mode 100644 index 0000000000000000000000000000000000000000..8562965e4e1d46b357e3c59b888a896fd21c17f5 GIT binary patch literal 3201 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 RTEV|#dmBgVvhBWce*p{SmSO+^ literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf5.png b/seasonals/autumn_images/leaf5.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd8e220a3b769188da275aba1910520c2f9cd99 GIT binary patch literal 3042 zcma)8dmxkh8((E;5~7lF%&XE#_HJWpvn6byOhRlF&GwqbE_N}OkmRzIbfwXqPC0Zc zr4%Jebxx^B$E9*4w{(3;s5TFC%SD_;Z4{PXq#iT+H)fNEvi@5?jc}usFhC2ouE@!8igzc8C(O*kOy3I46x1_87>L>fi`7<5mxvrr772^azf3oJ&V$zo0j$&0#lEE!%=fKaJa zL;^v%T#k|3V1!~Wh$9k-AQlhe@z!vJwIo^~Wkp#FBo?X?qcy0Ige~TYq&%Sjt*Xfi z7Rsa)0Dy7ySaB$d_occ(GS)sU1gJtl90m)19WDwLN`;b8q3AQCZ*o4v-z7?UA^&oY z3i&P^mhZ37SnzJ2_XlG}Q$BYtC=}2EVimU3Lp{-IWjiHQ8%dezY3KIL!@$+7;@yoH<$uAhJ^579iq{m zDx;(EXgvH-62485heB|<&#hs7uvn6<9mxhi)*ARjGHT2HE16OB{~@#R6PeMJe~|f3 z=P@#5Q1$$O5{e9dC*^3sR|5lXVssB4MDRodKaVtc@p&jh0(cUN;gOdp-<^R#j7#Lf zHvP_?2*kYYvhAhIogMX49Sr9j-kzq#U}z|O6``9BZlzV}+y@kY)z1dAGTZtBH);f2 z@%7Z_m!UrBoS9mPbX=)%%A+XsNGlPXNUgesw{IDVE}xg5_omw1l`HmN+w@|! ze_%w@=7#R0NlOb^G{4RyZ}VqOoff(wW$&`jK07eN9hR8!_*v3JYDJx0H9-Y@Q#x4$sutcZDfbHI~`DErhBsH-e#PyMnx1w*+M$58J} z&!$bD%vw@o{~#V=yq8;9drTe!zq=-iT$vICLdQ^bjYBANjS&cqayP1@kE>#LJv}YR zZ^re$7cYqKMuOJmHt-5}=F#o>x~RImokvlRW_WKkqUM!2QBN1-_|in(m8+5k4;emP z)hLX#b?GEmgTCZ-O5^6W2K=t&J8<_s9*2wwJ99fD`aYhk#=BYS&FXD``LKU|P3gN_ zE4vvji))u3DG4_vkUYKCUz*)(ttbT^q%ZQmJ+WI3!Bi$yK=A_=3+_*M)!B!tVUHbImzI2mr z-d_iDmg@JJCii+_myVDWS=##sZgnbm?!46w#vSXl76m%HP+kvn!aL&!+uXu!M`A7b_oLsRDdyh0;1g!|9ei0Sh-V0`GcRBvb(%)<==b zMt3A*LqWwA9V$|1dv;(EK%^k;`x?@RT(Yv1lIuZlb?kX&)gg{|M_VXIhe4ZJYsli0^d6=u371UO1Ph^*BrhiXPUHs ziTTYd>))E>HWs9jrxB7?Z7=W~H`O1nv!^t!#k9M=o!|XXQT(wPHxt-XQj!($F3GpF zE;mH8;$e+;>>q$X@sZpdv*QkS&dW*B8Zuy4^4xus2)R{v0k+>DdoKQ zzDQoly%;x}Za18`#?+;$r1{PJG=mk(NLu7K?tN^(PV(ZGzoYy3tt$_#v9fxxup_oD v&Hxd_Q`XR1Q#Zv_m?il1G|se^mJfh2`Ft_|TuqJYuelq|gL=Yg?Z*EAltRMQ literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf6.png b/seasonals/autumn_images/leaf6.png new file mode 100644 index 0000000000000000000000000000000000000000..154843fd68caf47956f95b7609de15b9c0faade9 GIT binary patch literal 2766 zcma)8d0bNI8m4kd6sSOTEj27DjWy9cnnxp)3J=kUGH`@PHaJ?A~-vzVbMq&*UW zK%m0I=#lVq8hqJ|H-Ya)FHM3 z)ia^v1qg!DAXyYF4Umcn4-V?} z1r#0>#F9aLQ5uZNBSYt*!-Io-h!h_mED2{QK*u8xF6Icp2v8zW2;t<0_#c6VBA(uE zC`xbFHJFy6Q%HOTvGWCia^Ud}sgzRyU8M;Lte=xKa{<ihW} zv!LVQzTA*XPVmC}xlt~UI`6xp__Z&$RX^H2)E-w#T)aGw-b|C5@f^SN*k1_;qiSr&pA(xOeY#OGRyD-TK#) zmdrk3x2a=B_iARg=Mk3orK*R#pinVDPTDdt@VHW3R;U7I>CaF>~A~U3>p1 z&x%Nnf3|Injq!VujJ)}P@niFNLCWh}T)W{3 z%l7X(v+hEb@m60l_PEu;+t;5~=2c5$j~6WJOIQ1?JOw_e&E3-WUGu@AVk%7-b?%X^ zr6niun%~VI5q8@J^(_ZfS@5^ZOd1v|Mh{hzNzb)Q*7j|iIFxw4 zb-|O8?V%3Blv_plhnRry5rQQL@+)inE-EL1uwCLeu$A0c)-3&{s??`Up_sTc^nYjJO7%9D= z=g?_~>(mj(v>M}a9W{j33#TCuCCXHpawo;va_8T1r_?0RJko~NfeCYddGLT0Hbgk5 zd{|$aSbgtQQk36mky5zD56h9(f!U>U+->KUmAK(a{L;{Kc89l> z-+ARyd-q9&O>0K|V)oe73#2l|Ek2H$qzZJ5l+Il;6Epn}# zMf1yx8>)*Erf5(a6dHy0B{p42)Y?Me>ziwu-#vRPyL-GeVHT1o9k}AeisOWrb&Vr# zK)XkdEnCIwy=~EXkR9==rm@Cqiu0T~>vq<6GRgU?9Se$G{4}{WEHS2h`RpwzQ;0Fs z3%hEjy_t3W*TBZ?a-TT&-}|;HyDnFyPwTE`0fUn?rrk8hhRSktb%d$e5zAM&hZEqhO2ytEPur~kHiX(v)cb({{rA7&XE?W9kjPEZ_r{@Y1 z7_mRx<2^lJ*V+zEO=~ZoUmG&$MO&4TVe^Q;U zQk4A;J5A5 z{KOZrhcg7npBe>kHf@M44OC*UlTG{48kbG2kK5j9XHFTrZbx5N0U=v(r%}G;+IZwe z_oI~!#AHv~7PlZqHqNG~$_L9jhIm6c7UjFb5%F{Gp`a7iIp^m5zz9jmo?GLOXdX8)IEdY$gB3$gEAapT literal 0 HcmV?d00001 diff --git a/seasonals/autumn_images/leaf7.png b/seasonals/autumn_images/leaf7.png new file mode 100644 index 0000000000000000000000000000000000000000..7b89b00abc13c4b854a28562fe74ad02b3c1e97d GIT binary patch literal 3277 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 D{y&O7 literal 0 HcmV?d00001 diff --git a/seasonals/christmas.css b/seasonals/christmas.css new file mode 100644 index 0000000..0b4a1cc --- /dev/null +++ b/seasonals/christmas.css @@ -0,0 +1,132 @@ +.christmas-container { + display: block; + pointer-events: none; + z-index: 0; + overflow: hidden; +} + +.christmas { + position: fixed; + top: -10%; + font-size: 1em; + color: #fff; + font-family: Arial, sans-serif; + text-shadow: 0 0 5px #000; + user-select: none; + cursor: default; + -webkit-user-select: none; + -webkit-animation-name: christmas-fall, christmas-shake; + -webkit-animation-duration: 10s, 3s; + -webkit-animation-timing-function: linear, ease-in-out; + -webkit-animation-iteration-count: infinite, infinite; + animation-name: christmas-fall, christmas-shake; + animation-duration: 10s, 3s; + animation-timing-function: linear, ease-in-out; + animation-iteration-count: infinite, infinite; +} + +@-webkit-keyframes christmas-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@-webkit-keyframes christmas-shake { + + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 50% { + -webkit-transform: translateX(80px); + transform: translateX(80px); + } +} + +@keyframes christmas-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@keyframes christmas-shake { + + 0%, + 100% { + transform: translateX(0); + } + + 50% { + transform: translateX(80px); + } +} + +.christmas:nth-of-type(0) { + left: 0%; + animation-delay: 0s, 0s; +} + +.christmas:nth-of-type(1) { + left: 10%; + animation-delay: 1s, 1s; +} + +.christmas:nth-of-type(2) { + left: 20%; + animation-delay: 6s, 0.5s; +} + +.christmas:nth-of-type(3) { + left: 30%; + animation-delay: 4s, 2s; +} + +.christmas:nth-of-type(4) { + left: 40%; + animation-delay: 2s, 2s; +} + +.christmas:nth-of-type(5) { + left: 50%; + animation-delay: 8s, 3s; +} + +.christmas:nth-of-type(6) { + left: 60%; + animation-delay: 6s, 2s; +} + +.christmas:nth-of-type(7) { + left: 70%; + animation-delay: 2.5s, 1s; +} + +.christmas:nth-of-type(8) { + left: 80%; + animation-delay: 1s, 0s; +} + +.christmas:nth-of-type(9) { + left: 90%; + animation-delay: 3s, 1.5s; +} + +.christmas:nth-of-type(10) { + left: 25%; + animation-delay: 2s, 0s; +} + +.christmas:nth-of-type(11) { + left: 65%; + animation-delay: 4s, 2.5s; +} \ No newline at end of file diff --git a/seasonals/christmas.js b/seasonals/christmas.js new file mode 100644 index 0000000..d3e467e --- /dev/null +++ b/seasonals/christmas.js @@ -0,0 +1,122 @@ +const christmas = true; // enable/disable christmas +const randomChristmas = true; // enable random Christmas +const randomChristmasMobile = false; // enable random Christmas on mobile devices +const enableDiffrentDuration = true; // enable different duration for the random Christmas symbols +const christmasCount = 25; // count of random extra christmas + + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the christmas +function toggleChristmas() { + const christmasContainer = document.querySelector('.christmas-container'); + if (!christmasContainer) 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 christmas if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + christmasContainer.style.display = 'none'; // hide christmas + if (!msgPrinted) { + console.log('Christmas hidden'); + msgPrinted = true; + } + } else { + christmasContainer.style.display = 'block'; // show christmas + if (msgPrinted) { + console.log('Christmas visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleChristmas); + +// 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) +}); + +// Array of christmas characters +const christmasSymbols = ['❆', '🎁', '❄️', '🎁', '🎅', '🎊', '🎁', '🎉']; + +function addRandomChristmas(count) { + const christmasContainer = document.querySelector('.christmas-container'); // get the christmas container + if (!christmasContainer) return; // exit if christmas container is not found + + console.log('Adding random christmas'); + + for (let i = 0; i < count; i++) { + // create a new christmas element + const christmasDiv = document.createElement('div'); + christmasDiv.classList.add('christmas'); + + // pick a random christmas symbol + christmasDiv.textContent = christmasSymbols[Math.floor(Math.random() * christmasSymbols.length)]; + + // 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() * 12 + 8; // delay (8s to 12s) + const randomAnimationDelay2 = Math.random() * 5 + 3; // delay (0s to 5s) + + // apply styles + christmasDiv.style.left = `${randomLeft}%`; + christmasDiv.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) + christmasDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + // add the christmas to the container + christmasContainer.appendChild(christmasDiv); + } + console.log('Random christmas added'); +} + +// initialize standard christmas +function initChristmas() { + const christmasContainer = document.querySelector('.christmas-container') || document.createElement("div"); + + if (!document.querySelector('.christmas-container')) { + christmasContainer.className = "christmas-container"; + christmasContainer.setAttribute("aria-hidden", "true"); + document.body.appendChild(christmasContainer); + } + + // create the 12 standard christmas + for (let i = 0; i < 12; i++) { + const christmasDiv = document.createElement('div'); + christmasDiv.className = 'christmas'; + christmasDiv.textContent = christmasSymbols[Math.floor(Math.random() * christmasSymbols.length)]; + + // 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) + christmasDiv.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + christmasContainer.appendChild(christmasDiv); + } +} + +// initialize christmas and add random christmas symbols after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!christmas) return; // exit if christmas is disabled + initChristmas(); + toggleChristmas(); + + const screenWidth = window.innerWidth; // get the screen width to detect mobile devices + if (randomChristmas && (screenWidth > 768 || randomChristmasMobile)) { // add random christmas only on larger screens, unless enabled for mobile devices + addRandomChristmas(christmasCount); + } +}); \ No newline at end of file diff --git a/seasonals/fireworks.css b/seasonals/fireworks.css new file mode 100644 index 0000000..5314a2b --- /dev/null +++ b/seasonals/fireworks.css @@ -0,0 +1,66 @@ +.fireworks { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; + + /* activate the following for fixed positioning */ + /*position: fixed;*/ + /*overflow: hidden;*/ +} + +.rocket-trail { + position: absolute; + left: var(--trailX); + top: var(--trailStartY); + width: 4px; + + /* activate the following for rocket trail */ + height: 60px; + background: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); + filter: blur(2px); + + /* activate the following for rocket trail as a point */ + /*height: 4px;*/ + /*background: white;*/ + /*border-radius: 50%; + box-shadow: 0 0 8px 2px white;*/ + + animation: rocket-trail-animation 1s linear forwards; +} + +@keyframes rocket-trail-animation { + 0% { + transform: translateY(0); + opacity: 1; + } + 100% { + transform: translateY(calc(var(--trailEndY) - var(--trailStartY))); + opacity: 0; + } +} + +/* Animation for the particles */ +@keyframes fireworkParticle { + 0% { + opacity: 1; + transform: translate(0, 0); + } + 100% { + opacity: 0; + transform: translate(var(--x), var(--y)); + } +} + +.firework { + position: absolute; + width: 5px; + height: 5px; + background: white; + border-radius: 50%; + animation: fireworkParticle 1.5s ease-out forwards; + filter: blur(1px); +} \ No newline at end of file diff --git a/seasonals/fireworks.js b/seasonals/fireworks.js new file mode 100644 index 0000000..8fdba14 --- /dev/null +++ b/seasonals/fireworks.js @@ -0,0 +1,159 @@ +const fireworks = true; // enable/disable fireworks +const scrollFireworks = true; // enable fireworks to scroll with page content +const particlesPerFirework = 50; // count of particles per firework +const minFireworks = 3; // minimum number of simultaneous fireworks +const maxFireworks = 6; // maximum number of simultaneous fireworks +const intervalOfFireworks = 3200; // interval for the fireworks in milliseconds + +// array of color palettes for the fireworks +const colorPalettes = [ + ['#ff0000', '#ff7300', '#ff4500'], // red's + ['#0040ff', '#5a9bff', '#b0d9ff'], // blue's + ['#47ff00', '#8eff47', '#00ff7f'], // green's + ['#ffd700', '#c0c0c0', '#ff6347'], // gold, silver, red + ['#ff00ff', '#ff99ff', '#800080'], // magenta's + ['#ffef00', '#ffff99', '#ffd700'], // yellow's + ['#ff4500', '#ff6347', '#ff7f50'], // orange's + ['#e3e3e3', '#c0c0c0', '#7d7c7c'], // silver's +]; + +let msgPrinted = false; // flag to prevent multiple console messages +let spacing = 0; // spacing between fireworks + +// function to check and control fireworks +function toggleFirework() { + const fireworksContainer = document.querySelector('.fireworks'); + if (!fireworksContainer) 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 fireworks if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + fireworksContainer.style.display = 'none'; // hide fireworks + if (!msgPrinted) { + console.log('Fireworks hidden'); + clearInterval(fireworksInterval); + msgPrinted = true; + } + } else { + fireworksContainer.style.display = 'block'; // show fireworks + if (msgPrinted) { + console.log('Fireworks visible'); + startFireworks(); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleFirework); + +// 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) +}); + + +// Function to create a rocket trail +function createRocketTrail(x, startY, endY) { + const fireworkContainer = document.querySelector('.fireworks'); + const rocketTrail = document.createElement('div'); + rocketTrail.classList.add('rocket-trail'); + fireworkContainer.appendChild(rocketTrail); + + // Set position and animation + rocketTrail.style.setProperty('--trailX', `${x}px`); + rocketTrail.style.setProperty('--trailStartY', `${startY}px`); + rocketTrail.style.setProperty('--trailEndY', `${endY}px`); + + // Remove the element after the animation + setTimeout(() => { + fireworkContainer.removeChild(rocketTrail); + }, 2000); // Duration of the animation +} + +// Function for particle explosion +function createExplosion(x, y) { + const fireworkContainer = document.querySelector('.fireworks'); + + // Choose a random color palette + const chosenPalette = colorPalettes[Math.floor(Math.random() * colorPalettes.length)]; + + for (let i = 0; i < particlesPerFirework; i++) { + const particle = document.createElement('div'); + particle.classList.add('firework'); + + const angle = Math.random() * 2 * Math.PI; // Random direction + const distance = Math.random() * 180 + 100; // Random distance + const xOffset = Math.cos(angle) * distance; + const yOffset = Math.sin(angle) * distance; + + particle.style.left = `${x}px`; + particle.style.top = `${y}px`; + particle.style.setProperty('--x', `${xOffset}px`); + particle.style.setProperty('--y', `${yOffset}px`); + particle.style.background = chosenPalette[Math.floor(Math.random() * chosenPalette.length)]; + + fireworkContainer.appendChild(particle); + + // Remove particle after the animation + setTimeout(() => particle.remove(), 3000); + } +} + +// Function for the firework with trail +function launchFirework() { + const fireworkContainer = document.querySelector('.fireworks') || document.createElement("div"); + + if (!document.querySelector('.fireworks')) { + fireworkContainer.className = "fireworks"; + fireworkContainer.setAttribute("aria-hidden", "true"); + document.body.appendChild(fireworkContainer); + } + + // Random horizontal position + const x = Math.random() * window.innerWidth; // Any value across the entire width + + // Trail starts at the bottom and ends at a random height around the middle + let startY, endY; + if (scrollFireworks) { + // Y-position considers scrolling + startY = window.scrollY + window.innerHeight; // Bottom edge of the window plus the scroll offset + endY = Math.random() * window.innerHeight * 0.5 + window.innerHeight * 0.2 + window.scrollY; // Area around the middle, but also with scrolling + } else { + startY = window.innerHeight; // Bottom edge of the window + endY = Math.random() * window.innerHeight * 0.5 + window.innerHeight * 0.2; // Area around the middle + } + + // Create trail + createRocketTrail(x, startY, endY); + + // Create explosion + setTimeout(() => { + createExplosion(x, endY); // Explosion at the end height + }, 1000); // or 1200 +} + +// Start the firework routine +function startFireworks() { + fireworksInterval = setInterval(() => { + const randomCount = Math.floor(Math.random() * maxFireworks) + minFireworks; + for (let i = 0; i < randomCount; i++) { + setTimeout(() => { + launchFirework(); + }, i * 200); // 200ms delay between fireworks + } + }, intervalOfFireworks); // Interval between fireworks +} + +// Initialize fireworks and add random fireworks after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!fireworks) return; // exit if fireworks are disabled + startFireworks(); + toggleFirework(); +}); diff --git a/seasonals/halloween.css b/seasonals/halloween.css new file mode 100644 index 0000000..3239b38 --- /dev/null +++ b/seasonals/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/seasonals/halloween.js b/seasonals/halloween.js new file mode 100644 index 0000000..2be049a --- /dev/null +++ b/seasonals/halloween.js @@ -0,0 +1,135 @@ +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", +]; + +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/seasonals/halloween_images/bat_20x20.png b/seasonals/halloween_images/bat_20x20.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed37d5fbb3b9738b66f4ecbff214dd1f1cd554a GIT binary patch literal 6017 zcmV-{7k=o8P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+TEIIa^<>mg#Tj|UIOM}IT$0n125lSf|Od)?b~m# zBOGC=rE|nXfvWST zM!$XG)%)qgJyt{U%};{vNC)5U_!3%JCRFk?$y(sB|D21v_igun(^c-g9A|pRVC3?z z-{yA*|DEs8fzAi*v-WlAq4ZeTaUL0hf|r z&Kz)u>b+&$MP{~U%|NJOGU3aM$KldKpM_$jf1p`JpDCZ&{9Nj0_9bI38L zoO8+Is9r*eC6!!Csil=(Lya}nTuZIB)!uvyP*`fY71L^Kt#@wP8MzWljl-pU4B^@q~t88jFG{(olnPo=I&SK{+KtD;=hzP|96=)O5OiP=8RJJX6~ecysSO8WY%71C4Q3gDB1kGn^xgr*m8{vlxKVgCBXt zQOH6rTOoz@S0P`ybHOU39E}lEZnM_7$W}Sf_~`fC$tC7&kfl-My*!qYlHN7li>t=j zA+5av+3TS>NPEuh?5X7>sQ>sqbiUyu2G1>=fgCg6MzVF6k1fQVQ$^tHn91#(Y;kQ(j20B|yQxyLmBlhKE%>Bm_39lFCzsf=UB(%1-%od`M)TeZ zD^<267!XAg63%%8Mfo;@$^|RC17nb9|Axv^;QAzN!xb7za{lK@iA3uMS>nFm+xS2=1Ny zWUf@OZbUv&;KzkVQVecXP_mS(?$dL=Q!sg~Sq?G^jGxlT1Jvf@<5(;D$mt2+$Tedt zO+iCLjcXrEm}Z4v&*^4^%oBa;v5nD!Uv-bcrzeG2;5&Ot?qskJDiWhJa>OdZ!kPN@ z;iP=#?lZ}-0|u@Mc&a=bRohn8V$ zPXn!3zNmQc2h4=pr-0LVaD=jLqKACc5!adzj2>7FIN9vXqJ2G^D$(1*UGAX~Sx-V# zY6g?pFSw-abS5FKNfUy5NEC6>YzmM z>aKC~oJZgv5>t&Q{4hsvNY^d!RKZ*5OmxU&&| z{zl7KRWdk$OcJ;iK;hF9+i4e?7COr9IFF38qPTa|>{IUm+xtD?yV)q?QFe)DyF9V? zAQ9L*WL+R1p@Xg!OS5Am;e@HWG8L69&QwvEDe|Z=;`2(R4u|g#ZH0gL@KHG-Nv*#6fhZNuLBe0 z9OoA>0Bls!@feV`lX4!ialEWJVoCx)ivWlGFUi=fyy2G!p2}QI!MA}N5v>#}ol>`}89TXi zap-}a^KYPwa!L%4w+Xs zhQwt+Nbq9^Y)*b18o|1G`N%K{Ij1f8X(wbc{ zJly=K2;(N91^KU=YZv&jS2orap@@@F7?li@k0ZUPGu_R_)V`R?pO~tBb5pP%`i>9D z?fGH~79d;*z0IcfvX_%dz%tkkj$n>fE8`K?*`uct(A|NZ=u17ADq+~NJV9GF){H%7 zMkUP#OM_8#8-W~n*9MAU9{jP29dRVKDYXfW4}{cPn&XK`EFi|(;N#fL5L>0Z(F9Qg z2;^)EBCqXT!3g`)8FjY^*1%5b2~blXDn~ekOhN+3QETuP(t|>TmVOV&z6OgK)O<;~ z)PdY!7{C}lfT^+!zs)@I5*Ky=1M#Ehmkfl*)&B;TBi<|LJ*G?Vg@!9v0y7Db3vgS+ zKaq>W8NHs;om3fjgvE&1wWArynG(qKWqsXDm~70u6o$l1Q6JlfLXXx(EpmO`eM>}x z3N;~ULbEEJIe6o-a;~Cm(9clvs;Y$UM5c<uUUz_A<&ij)*heu9Av@*I^iZ3QBG& z)KNsM;R1zr3<~9=h`c2lmfDIcr6c;47v2Y&)O9X)Z|p#Cy8h_0=L_J%H~`o^g))B? zia)7g=>uM7#zCao_3%jF<*G} z5KTHfUGE+3XC81x)cETEy4I*3L?Z#tgyYOgGx8mCFsEUalI*G6;loiISzV1?$oL2F|R$8K2e5ac zWCQ=6Wd1!n+G84V2i=rgh~P_XMVfk!!RuH1wZsa{E1sZ>-rsN-i86|oBOD6 zQbQjWO@@a9WI1w2mC>~+qQCpN%$Wo@JViL%6{3V{S797fkKzFj^P3TGa`3JXc{Y4m z;z$%XympKT;l=}PLNzlkESS>(QXIH@9O1tS=TGNdjz?Bp=88?lVSYPJ22})+ZPb4c zFIP+K0aaIjQfgE~gK8kk0Fc$MBOu1n3mFGl^BZd8N(4cgjfo-|O%d&4~JsdiKmW4(+(jBco# ztjk%Bb&cHYY{qMAZlYr|CAcNPzkA$yA^li7v1`{)L18Uo3$bHQFrzI5s1*Um=C6rA z0%Zf^N{Ki3?2iopHsOta8>>azq0NnOYEz$^*1!o?8Jvpi-LOXRCgY#*0+0gBnjiv_ z8NO51HD+3CZ4j(@5XFVnL8P>vcFLo@P#rXL1(FgBnda!-c&Hh=<1TdBwDEBx#^7J~ zMv@P#PrN0kbP8c$xpC7Q{;k=-n)v#XvDNq&C@|m=kp&P$YNSL6?FLpOO?Y(efI{Np z0bHm3uO7XKgv;;_HY%!IPL%yTxyBRGZx^r)T*n;g(J@0;ph2IwwL3&P_VgFn+XrfoghqY&+08|8Eu#I$E)EbujXx;HtN8>K9X*SSQ(gZz!V{lHY%73a)(%Q zx_l&f*F~uiMNiyBaq?m!Cq&n4mnQW5%*iY@gXx(QErho}u|)rY>Fy*&`|q$FZL0R^ zu~AkygHJ0(qdhiPo(&A`HAi@VwhzZWdP7$-NKG?LW}^ouwqjxtIXX}EJ;U3aryfEz z;;%jg0HYW%JR$65Tnb5DKtUb{rN*oRNz+rBLc=3{Orf z^~61{>EH|;IT72^ACDn1po+G4u59~+Y_$VQfsE%3-N^eIvNkXw`Vdq5%JZ0p!)3<= ze`s$jodlgC?W%fb?eo>4GdjVc043WIUuajQ9tN}lIa!foq&$dvsYVWgB;y*AwgjCV z-)%JI$#9UMf$jpC#R+5lz#dH>nNA;=yol_H7DCiIC1r3JDQ+JhqLH_6TyzD#LP?oJ zRh~v(b3+ybKdt9|VeM`Ry^xEMZk{FJ=D`d?pEpID15L~(5Xj8nO81sX((b7pPl<$k zPov#;-BK8~g%*TZ(dNYSv{H19o^s92Te9c0gHgh0|qK~#ym5A%c@a9_&3sk zs#fg^AiY6WW(?IqGy_ZCEK|R`v~}SySc=t_9azUA<}uJkpK)LoCk(b^n916LM}zjS z)ZEh?x4VIUH%?*K_(E#kB_<^GsL&h4aaaP}qqeW9ETk+59Ze;Ce6MQ}!g%EkwhUVRU zzydwH%6AjKz*p)Lqjr=GB}8vSY0Y{wFbE0)E@ODB9Ey-(nfw_VVT8eBhK-;$e`~|x zvi%7r0at1{Qz-;!t0P#Gu7hb86kCra#*y=4$s8r7vKIRKqz9X!_p4sWmxpN)nMp6|rCt-}TN2syh+@@$)>w}w8$@wYRCx_V zzG2B6H)dun<2l_3mChEg-sz{mY#(d)_j!H+yUW5fgYgEE=!c%*W}hnR!_ZONO_4Ak z7^&gi^%xd+K<<5U+9Ib*(mI^y(^#^>575dL(iI6fbM12L43uI_^qd(|hpLfIZOF@;pg=?==;;jJYr8l_rko`q=jBP|1 zg7QK;_$iwzSy(=3s31Fo&J8Cl-G-4AqlhMw1L`Rd32yROFvxViiq5?BBD zXwdxWnc>H4IwOCJQ5VnSitt{TP86SZy(jB4)!iPDxuEj4NxR%7(#O}_$SGyaFIDo* zfpzLa^w1~g=b;bXk;p}a9q$%Xq(su)nAWCCfrCSU$uLEW_H#q4mgMLe3`VdJKIST$ zF;S6WWl?%kFS;ZP_1V=181gH~x2#}ZvY=K^fsiLW9E3>sJLi6g&j@2sj=j6qm^3oD z^aRFhb@%Zo_aU`ZG!7NTVsSfk++(HV9vQ=fO&`@fL0q>d?s{~Z6G1FhPo>sPDIKS4 z@#P)N@egCAN<2tkQEin7PZgcOd>0K8aUt#{CxFZ_B>rhSz_{(^#3;W|JRaB zdNw=S^KkB9*0s+PuG$&7kcbw7z$QK&&nSMF~{r@qLn6{b!2Bs7z<}NdR(EtDd24YJ`L;(K) z{{a7>y{D4^000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jm0`7Z3-oPvG(Z00Qwz zL_t(I%k7lSYg}a%#((F&_r7oD&R6C$Gn2s*BaOA08i4<-TKHJ0doO2$Y zbKpM*d2afQP9GVa?OS`??ss>B+U}2?W^irs&isP4-GL;fJSxX#PMDbgx}Qouue6tT zlv>*P{r)-k_VTU$7b{Oc0G-!%)AHO02Y6~{R03~lcxYGzzgXkrAzTl z#uY~n`h0(L`PRPEZr1U%UeZRRjmAU_$z0ae{?KJ$LLMJ*Lie}kVNF5Y^x_N`+Qzz@uWa7MXT@ex5trlx5ckzegm}rE(W{Yg8fM*OMf@gHNS8u-i z*`*Jb4|JTvc}Ql{-*}!kDe#GiSl9Ci8cnRVSZmp9v~WES5wQZFdY)HFVRcCR?LVtq5{CV|p(EGkzM7qF2d#g8 v4*&K&O8KK_#9<2{?2}usu6)P;IE=plr=$kg?~seB00000NkvXXu0mjfB&m?m literal 0 HcmV?d00001 diff --git a/seasonals/halloween_images/ghost_20x20.png b/seasonals/halloween_images/ghost_20x20.png new file mode 100644 index 0000000000000000000000000000000000000000..18c7dc48ae4da7c6781ea072427d800a4194829d GIT binary patch literal 8708 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 ixq=er(_}3*OaB2s!``e=5U2A10000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;uk{q|vW&dLpy#zRBEC-`m@1U38=OUAoC`#|C zKWmneRm_Tv0O0O-a3J0JKmYr>|HYqXvAL9ME4>uYpVU(igCCmz{P}!0pWeUkPYB=N z*{`p=pT7va6!{)M|1IZx{owWd#~W(;zCM3_-PQHIPy61;e%|=~iF&er{$AIGurWg z{`04`yLY#H&u4Zc6;`Ua@1%ZA<^9BklckLBZH2GO-^|bTeRaMXQ(Q!B6V1uja@H-d z+Sih88+Pry@5>fLOyPve_YhWy@3j_d=wY$^#=`SuH`LhUcElpYMbsiMho57y_uT%T zx2*BxZCn|Qn-R<3zue!w_&@pjd82!kx@NxpTr0-)3W#ASa{8C62#DS9n&!8@@5}uu zZ~UJE8;M|k%iNgY@bhzvneC6#|SIe@esZ{@#Ek;@O$OSR?|zSj<+;*AS{1 z>)43TVB{gDFo}TW9JaYjY+@_~rv*Km_f&h=h8#XG11$t1#}X@{>2VOOlrs5KQzM5) zjybuUbICQg-18{0q>@W1wFsj|jWyL=ORcrlUPp^9wcJXpt+n1p4?O~5xtCsDZ@u?1 zcu zo_6{fmt4E?rkiiM^|ssZ_!+ftRDX?{{Uvh$IcoNenj)6ob@h*^@p7#{ZefCxte6q8 zkc@~|ML^)BnE7TY1w~FV^F2@$IS@6=3eGk~j0mP>U{DF+ zxJlW$?>zchJFmqP^4x9JK6Z_3^5)A_bDnGD708^dnQ_o!1wQ_|DQV#c5|1e%tRF{l2G> z4EOTOTPx{)!R|)7zq|i(K_v%TSX$zg#;Px_ok(0H#+a*@xtYENr^HHO zrDnP$5^IJNS%4De@%ao`w%A=EpLt0W9#HR?mhRxkhSZ`+YA@~*Ur!}{$I$+o%!ve} z`a;REk-Pe_rB!-QhuWuxJ>w*8+&Gz7-WSWedtIH(7-`RW<0O#P$etbMOruO-%NliR zIrhBQE{)@^O8Qjl?o=v_w6Eiw5nDS2UZYeCg)~Ol zg0xiq1nN4Y@w1aaP~+Y!pS)TIj%_wOu^R$OZxVy_eG6*Dr%jB~Tj~tVjJL}E-+#Y_ z!b!=sHjnuU;8PcKfn3&hrnZRuKK^tc0G_g%@w=BI4|moE9;ma?mvtqV1BmbKeV2h4 znv6LB)kxfPSjq-6QWw-!FaIS^-0vs|@(@(=F3lbhJHQbbS2_}_#Mn=njKC7$4_v3c z6VkdA$CC4>A<}f4w#uPy*X3R;emI2Ac2pvss=VrmL!`(aD}_XDkgcETItXB$%!TAk zN2CLQAt6y#gGG$$F$5SYG1O`C%-k!Bx2Sn25@1UM;KLFG_a=mF`5%NUhwGaFi^x^? zkniCidXsX7!*-e|&U*vU(myD!e}Q4Lwk+VzbItJ!*lX!k|01)gT~b*PZ;B9_DVB$Y zcBuCU8xgkT5q0(hKCEw8e&n8i-`$TNeth4Q=xnIvj_C-qQ${D{c1uYhWTbo{gH_K7 zTsk}o;`30qMtsAE#uNa95w$|F`e3607_d*@;+nd34${Sq(B@JfkX1@sb zzKIZzJ&C-Alygs=x0q*6HGcPg0l1dEIgWA8$?LU9dDrR`+%(eDG zmAomd%J03w4UnM`fYMP3o%VZI~%C?W(+RM9{QB=trI1nRaiBES~~2NS1%R7|W7`d~&^uJv^aF&t~} zEb)jCLYLWMS{F?KO~gea;yp%I{SKmL8ay|+sG$gEM56ZUtOp=#926o|0?GiOo3e+p z0B-DS%nLy^CgiDV?=Tr!qVc96#@xk?Pm&-&)4yQ&?{^ZnRkY9~wq$m^rMZfFV=8l2 zRGzPB2lyhMj$F=^v$6pSeL>&UlH?&09+k93{uo-La7L`IqKQ1TNdDIn%G9zj|9qus zp#3>APfQZX5L;o5D+0Y2(i64G@`B?P4s@k64k@Xl;@7LmBse0@~EE;!F$8^$~YOoLWF1wyyi+5qHZZ*<1j<&5_C~>D&S-lhSRY zP03c2gDYrxZi#HEW!=C!@UBO(jII?VFXY5PNcMgzyj(Y!JrGJ2x>5pK0co3n&6CJ) zMNDd%tZ9)BW>*<&%eseNy#LT4%eW{2V zwAITi^gIrbCFRDvU9ZhC1qyp3(Gn}iqo{0WsjZyJNU|C)Wb>f-BMM+QMw$rrS{M5} z7c+s1hAFB6r8XnZ6zk2y&z14}Je()Sg+#y()d_UonMfjd@$Pva{-2GTM88t_s9uB~ z+6VteG3U%;Yp{73dJ91kspZLNfwYw75zLW_zLAD!f~CM)JkLckyqUVZ`4?N<3jfxI zqR87BWD(>+MimAOd&g*#M|y{mUx(SE>~i91X`_UiBs=*>>4NN=Id~aEWWm5e!{%7H zB0UqWv*?u0a8qc)WD+jEL}+7?FDF-KpUg{~&MYls3(XmL{7we(P`6k93swcp%OWAM z_CN@{GcDX9dV!u6Ja+ve<2n%rmFh{)DNC?{qK0|6BH2~RUs7^AIm(GrZ#|MC*p1O} z4tN~g71?kAYA&g$S~*}}edsf9Q5?K93X#Fp3)Ry)2>|!4$kacbG(IhZ zrxDQPj~G^Vctjla=VeSR(yxUQ)b>DitSc;4ZtjmQ91j!FN#yMbf-fp_!iO@) z+-_6B;B;(H!{I$^3h%k{4ic}Dq)XkMt>(cg6v{yO)E=>-f-|Jfge5#nEeX{Te*oA3 zhLE;;9+iO!U!$Yaixr&KNR|t0N{%ETsZz8^3ma&fFp&wWFvi}7yPkToaK!swRE&Q<5;%fbXo;}T*BE1JhMdFP@?~9Z&()CP zpdgi(9M~+u1{q~_J)qP!TDgVxI=9V$Y8CH z9O|)#LB$nf;NbbWJFOcvjCqkVnizeR+Y#e+hmW_0E0x6Q|l;pfEjRuO`ZeW zgJK(%I#6>80?JOEJAMo)j8TmggAuSa4Wvt@ePE19$Vpt=9>m!V_RXZ52XEnieIYZegQ&ZE%(ROH5Difp@zez60*2sq1KZ-Dt~^k?>pZ?t zlnWX<${|UN>RUSR!7cmvc zE7n-u9&`m<)8XiZ(+12-cHzkDN2^E#6x~9tU^@=isY>NYkYLfbCa^|r09-YOD~*JP z^c3S9)MupD*5&OF%6d?Pm}-JTE;-TjLTiK8y&lQ?PQDUja!Rg~5O3e$8LBN0ECg;K z?biI&nnk!|tpbpvJyq=3<)?B8C(;C*1TOR#lKx@$W_ z*1@fYszVt-3PHVUpR{9_buZ-YodiCqHrHU%bJ(oNYjq^QL+aWm+1i6lGouIi6;c-* z+GvkJ;qso0z>R$(u#U!qa<}FsKp_~Ut;qqRFd9kH&23+IN6;9q_sTvapJ80$GX<;E z8evB*<13-!8?1<{keZrimr=*cpE@1)KpGV))vA(>M;!c#5~TrnBqJ$_69xlJm0btQ zul-*B?sr@uT$pT?^$S9w;#c{l2409^&Ka;}^c?}LN_T)-OrGMHOZ?m{zL)8m8lw8#& zL*NnWB{f7usWp*QUhp4K8zXX&Nwpgm4~7EmF}A1sykP3g><5XWZi$awjXTKSxDg{m zHdfvSB7)UjvXT<*_n%7?Y@-@0#1w#K(#V{8q1f%G3|fGqqz@>iaT|27$wEZs<=$IO z9##~ZkS!*gh7zr6iFpJL60v`I!U^PE=<4+hsd;oMvAc_H&|i#6U1A-yskQmjC4hdcL_Muu7h_WQu3HGt8!BFBRo5y z$dX;48&kL7#m3?(R__d!7#RVp1bJ+7$?rC^ zbYMgqD-hQ@+LuHecX)ECf4sVpAAnhblDosSpI4)B4}qy;sH7!l8yWa(A&4Z$bh1{^}bF>=dv(nWH{c)B)4v6e9H z__VsGdMQzXl-vLnsbWfu63AG_ZBWb0VX0lUyVPwAjnN+rF*kNhYv3!to%8;ur3yM& zpnb$5;Ebm2&@J#SmSk84t{;!en#~fc0~un}VGj6)%7G2JP4g|L$u~T@8qLUSH5JG% z=>&+f?ST(RKD{<6dg8jHjhdmf*1&_dK(A=59AFPFO4^2mJg%Z8E1zaBK=1(C)Tg+J zTQc>ys12iC3PyNP*Z?!Q!JAE+b!z;nzve%?AomeEvHlo9@Ssvaz4i5VSL zB3?i)9DG6D^eMK-L++p z(yajs5Rrkjhm_K0g|_IVPv8S;O?&BvliH}X(X?#|R*`F%DH!YNF!ea9o-nhzS#7qo ztu8gM5S{|Y?h5GvIaeGsLI$A>cATPfY$9?Tahi6(J`J!NTq%j_4z(&L8HIYEF*72a zk}&-5dOaiXGjF?1vkBqiMh`POI&6W$3?v8x*6r8u4Y4dBR`1sJUYCwskg#!+@2G4- zbwlG`OT8T_Yk|i7IBGEP%#LZCQ|CPd{teA}KYhsG5GJ;yO4kVsHPx>&NE!124&t}p zx{mG-g!zFWTKL~Eq#JrvUkD&PTdQQq!aICgcWOid zE>tH0r9iSyI^EVs#?SD6Oc;3R^QQb4B$srE6%5S{8W9aAfG_s2sI`1lW@%!z!kaQy zvVxTu0TeCnG{9V}F5tGdjx$wO1e@fMh7=@(D8U>Y=|1>5fGfCagakG~a*nl~@*a4i z$Ro!97u1NZq!Gnegs+$d{2C$d$eO5IAFpAk5i6ZttHLat=FK|wv%&91BIqRNgg=np z>c1}?SvsK41x4N7I3V6qE=w@6)}}V2wl}8Q8weEWbZV1tzXmViLK3R1ntaQ`G*K+) z$BrKnEnN^z8paogRX>J#lbT4&tPNAyedI)=) zwr(RoWx5br_&9ALlS3V|@^+Ac?6SW*$Q{Tf^WbbOWt_J`pM9S^3kJs^nTUGf0tc6& zSt7THYOB3E&^aUM6LF-?$_`Ue))jcII+ar}5(km2PB1)&Wga@DQw&RY2}1NWY!PQ;Eq=P)2Oaz>u6wtvT`LwvQqcY)Q^PF6 z!c|8*UdIP`Ub%aFii33sXum)z?RierS!5QD0ztpW)w7ANw8!g;;;3zGASd|EFd* zczO)__v}G_TdW2b;Y1Vq$S0vODKx;@qx}!<6cKI%7bikHX{&aAj#QQ?cMC{wC>epS z(=AHQ?Z%ZE2Vuz;m=H|_7EQIR0S6s{uWAU)u2dSBL^*(EmdLZL{c_a&!Y^$%-$IW< z>{`)@`JG;!44t&FNfrZDI)AuPgdvE%P3J+H@)PMSy1mkDv4@3ibKLDAWuk4Zl75Q$3vx}^Hc6~>O=dBR(05)?3I-Zf;g0#}lm+{5#foGF{{+(xq7Bkz zQAZt+S32sbF~Z>(^Gvjm2|P$24Z`h!);)euWH2C|Z$R$ofbP*5au6AkNMnE%U*Ws` ze>lDL{eIp-90n`F4shG&Y#ft=-O;5tBVD`KF(u3!wDlaYUue?=H>IWRMg*Tco+02M z;1r!C1I~%W2=4$Lnzd{9G)l8jG!i67hpe?Po^=r6=#hcU_9C8g}UI zW#ca~x&sTVO@bvGsH1Iy9U!eNGFal4cLPB|B!XChE=KhZYov1nHR;SY%Z#;d8I=rr z$0Y#%k2@dt@}-1PS+dB$ZJvg3zgR2vFXTMBMtgQPR;Ma5Q_bO`8LWe-5HF zRD-$#BxSedV%BGH3VL5~fasLg#kwZx+_&kjBg2obRWX35Hfmy8l0R~4Cz}q+I-YQj zcsmHBlg@Ah|HZBcDZ~<(^TTj--jw$SwUM;l`8mBxzIruz5fNg}G`YnblmKL=15;HR z*{JrZk4&|9va)iyPQhoC4Kfz2QJ)$p)dm%Gq}Fw zP}4)*h^T%LlR$Qc6a!QTh{yImoKTU1*gW|$uTMYlF2o4#YcMiG=(_fK(4hJpikfPy zCTqFS&lCO|;O@jFRyAfA>Nk3oPVWXVfQ1N^_Ih9Xrzw8=ZPos|pEgAlbl z)aKN|D)pROhah!`AVd3A2dCgx6^1X-!8eH;%IxO7gh?djO+Su^tr={xQh4y%;cy%T zlqQBb+Fk5wmcL?g&=xnQe6Bnt)q&me-E(;l5dI;~Q7jeOlm!s9mxfysk22N?mv+() zcO;A@&;=X_;?J+6Xm!Xl&Ypf1NQFob}YX9Ly!+jZ~tP{5xZZ zzuyu%V7BN_{?3d20T9y>q6o`Z6jan^G|DE=97ohv1^^ayVU;=xUHw>6QW`Oh(}|6+)%4vuRGquR$rmA+@hw$A zRfKcouTfM8wAx|Xs!x1S`ucDw1w{Vq2oW+uINE_&52hdskuo}CqBFJ^&<_P?m^P`C zHyPsI9;XTt{}Uu2sLU*>TW@VTKXH82Q2{DbooQ{^UjL3-NYtXXbXpsRb?cqUI9I!c zSeAMfD}7u=G~yW+{$0#H@#%!59W|Qv_#R{cbdKI<*EM~#H_Cn{p+{oK$Xysyr0wM? z^w+Sf0Lu0INY*FqX6p!@KDmb~2Yei=sg$=DUZ*~ApyORgo?@7@EDy$%@mC#T(ch+O zeV<*^!MA`H!7yMw^dT>v$K^3RKZ7QmFhj&5%SFMxetw@iAUD5tSMm}rBmV|N(+7!; ziplA-i%P|=4O~(OC-gd=erZcwrvq~OugBz}O1C?}{eJ-!gLhaqSYLhs000JJOGiWi z{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Rf1Pd1&HOejiegFUk zy-7qtR9M5+muqZPMHI*XGxy%T_wFvY-R^GfgYvKx2q2G=(ju=w5E7y$^+AY$6(ypg zA^L?7F+7C$3I+lJ1r;$E0?|e>(HbOTp%%3^Kq!cX1=>Pk+hx13kNX}!lvkyt?6xF2 z-)82XGrycU=YQq`|B*qGH7MFR?IqDCzNuPT-y3U^AchUy2sj{|*Hyh<51KV~tE(z? z%?#c*kO@0x)-WG8_U=v@Y>k0wtX2zaUtj#_)Yi+#np^K?Lz4v&cwX)98wLU*Qc#5} zl>0l^KDc7k`HAaiuIyD1UgGPMzJG~2?E-$qh?T|jdJW{-Rb5Xh8BGSM)luDRAgX#b zrK+&P=E0gx2ha2x2!oIkh@+8x*sD3hh?zV^gf&#YweOqWO;#i6iih5&eb%ktdvTQi z(4f9~3x-V64OI?osGH=T>O)#_CZsGGjIeH!15l2LJ9{i>W0y`I<0y6>A|iDHKw#qu zT&g$+07x(KW9uS6nxh2BaDsYV_{o&e!rcnA)n=UeZSKB7J&uSan7KqC&KvWAFAjxg zbOz4uu1DM9Rybaeu;jHSELk96a)}?VS{`*sgTw8B7S)iraP9YAllY=_Q=iM|D{jB$ zrnl(=pf@J4F1rB-s;;1-(!~4A{FwM;po9ByZ%>J_Y;Lz+8((#Fb9F;4{(-8ho=Yi5rWI)` zZ-=m$8=F5n3!oYE%5ssHX&`)+Ls0c%{w@w-87M3CLY57vriENZhGImp>Ial|1<@^t z%bn)+q(w_RgpgPugn}^}6a)Z+M={}1E@N~^$F`jj%>34mqTwBV|1wBm%Nj2h&T%8#Z+F;xVmgQ7LW*I7=5vIIfJTqUiqgR2-a`cuw(&;SyS4f zTTb*rAI-X}es-xN7M1H7Rr`TFn7&|zi2hI5AjH7q(l_+gh?emspHDm|4N$N)m8poLs2J7%-F~l}F;FBntOXF~5iO?DV zy;gv?nEr`#BdoFAFNEx$dPuj&kGj`n%f65!%Z z+-kxMss-!|DIW|FqiGNCsbAFNhtcv$BgV%CtNxAt=9xY`QT~ccfnm*cBUk2*$&{wLIhNi5 zf>9iAvtKn}_iatEFJC^%FFo+{ff(+`AcQ!_4jruc+-_HOS;@Pn=NDWE%+C+k%^z0& l$*fUD08my|=EMJW`~w7YK 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 W5s0rZL-kt#0000 { + if (!hearts) return; // exit if hearts is disabled + createHearts(); + toggleHearts(); + + const screenWidth = window.innerWidth; // get the screen width to detect mobile devices + if (randomSymbols && (screenWidth > 768 || randomSymbolsMobile)) { // add random heartss only on larger screens, unless enabled for mobile devices + addRandomSymbols(heartsCount); + } +}); diff --git a/seasonals.js b/seasonals/seasonals.js similarity index 100% rename from seasonals.js rename to seasonals/seasonals.js diff --git a/seasonals/snowfall.css b/seasonals/snowfall.css new file mode 100644 index 0000000..8e8f25c --- /dev/null +++ b/seasonals/snowfall.css @@ -0,0 +1,8 @@ +.snowflake { + position: absolute; + background-color: white; + /* background-color: rgba(255, 255, 255, 0.8); */ + border-radius: 50%; + pointer-events: none; + /* opacity: 0.7; */ +} \ No newline at end of file diff --git a/seasonals/snowfall.js b/seasonals/snowfall.js new file mode 100644 index 0000000..c9c55b2 --- /dev/null +++ b/seasonals/snowfall.js @@ -0,0 +1,106 @@ +const snowfall = true; // enable/disable snowfall +const snowflakesCount = 500; // count of snowflakes (recommended values: 300-600) +const snowFallSpeed = 3; // speed of snowfall (recommended values: 0-5) + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the snowfall +function toggleSnowfall() { + const snowfallContainer = document.querySelector('.snowfall'); + if (!snowfallContainer) 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 snowfall if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + snowfallContainer.style.display = 'none'; // hide snowfall + if (!msgPrinted) { + console.log('Snowfall hidden'); + msgPrinted = true; + } + } else { + snowfallContainer.style.display = 'block'; // show snowfall + if (msgPrinted) { + console.log('Snowfall visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleSnowfall); + +// 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) +}); + + +function createSnowflakes() { + const container = document.querySelector('.snowfall') || document.createElement("div"); + + if (!document.querySelector('.snowfall')) { + container.className = "snowfall"; + container.setAttribute("aria-hidden", "true"); + document.body.appendChild(container); + } + + + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + + for (let i = 0; i < snowflakesCount; i++) { + const snowflake = document.createElement('div'); + snowflake.classList.add('snowflake'); + + // random size between 1 and 3 pixels + const size = Math.random() * 3 + 1; + snowflake.style.width = `${size}px`; + snowflake.style.height = `${size}px`; + + // random starting position + snowflake.style.left = `${Math.random() * windowWidth}px`; + snowflake.style.top = `${Math.random() * windowHeight}px`; + + container.appendChild(snowflake); + + animateSnowflake(snowflake); + } +} + +function animateSnowflake(snowflake) { + // Animation Parameter + const speed = Math.random() * snowFallSpeed + 1; + // const speed = Math.random() * 3 + 1; + const sidewaysMovement = Math.random() * 2 - 1; + + function fall() { + const currentTop = parseFloat(snowflake.style.top || 0); + const currentLeft = parseFloat(snowflake.style.left || 0); + + // fall and sideways movement + snowflake.style.top = `${currentTop + speed}px`; + snowflake.style.left = `${currentLeft + sidewaysMovement}px`; + + // if snowflake is out of the window, reset its position + if (currentTop > window.innerHeight) { + snowflake.style.top = '0px'; + snowflake.style.left = `${Math.random() * window.innerWidth}px`; + } + + requestAnimationFrame(fall); + } + + fall(); +} + +// initialize snowfall after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!snowfall) return; // exit if snowfall is disabled + createSnowflakes(); +}); diff --git a/seasonals/snowflakes.css b/seasonals/snowflakes.css new file mode 100644 index 0000000..e898e7d --- /dev/null +++ b/seasonals/snowflakes.css @@ -0,0 +1,132 @@ +.snowflakes { + display: block; + pointer-events: none; + z-index: 0; + overflow: hidden; +} + +.snowflake { + position: fixed; + top: -10%; + font-size: 1em; + color: #fff; + font-family: Arial, sans-serif; + text-shadow: 0 0 5px #000; + user-select: none; + -webkit-user-select: none; + cursor: default; + -webkit-animation-name: heart-fall, heart-shake; + -webkit-animation-duration: 12s, 3s; + -webkit-animation-timing-function: linear, ease-in-out; + -webkit-animation-iteration-count: infinite, infinite; + animation-name: snowflakes-fall, snowflakes-shake; + animation-duration: 12s, 3s; + animation-timing-function: linear, ease-in-out; + animation-iteration-count: infinite, infinite; +} + +@-webkit-keyframes snowflakes-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@-webkit-keyframes snowflakes-shake { + + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 50% { + -webkit-transform: translateX(80px); + transform: translateX(80px); + } +} + +@keyframes snowflakes-fall { + 0% { + top: -10%; + } + + 100% { + top: 100%; + } +} + +@keyframes snowflakes-shake { + + 0%, + 100% { + transform: translateX(0); + } + + 50% { + transform: translateX(80px); + } +} + +.snowflake:nth-of-type(0) { + left: 0%; + animation-delay: 0s, 0s; +} + +.snowflake:nth-of-type(1) { + left: 10%; + animation-delay: 1s, 1s; +} + +.snowflake:nth-of-type(2) { + left: 20%; + animation-delay: 6s, 0.5s; +} + +.snowflake:nth-of-type(3) { + left: 30%; + animation-delay: 4s, 2s; +} + +.snowflake:nth-of-type(4) { + left: 40%; + animation-delay: 2s, 2s; +} + +.snowflake:nth-of-type(5) { + left: 50%; + animation-delay: 8s, 3s; +} + +.snowflake:nth-of-type(6) { + left: 60%; + animation-delay: 6s, 2s; +} + +.snowflake:nth-of-type(7) { + left: 70%; + animation-delay: 2.5s, 1s; +} + +.snowflake:nth-of-type(8) { + left: 80%; + animation-delay: 1s, 0s; +} + +.snowflake:nth-of-type(9) { + left: 90%; + animation-delay: 3s, 1.5s; +} + +.snowflake:nth-of-type(10) { + left: 25%; + animation-delay: 2s, 0s; +} + +.snowflake:nth-of-type(11) { + left: 65%; + animation-delay: 4s, 2.5s; +} \ No newline at end of file diff --git a/seasonals/snowflakes.js b/seasonals/snowflakes.js new file mode 100644 index 0000000..a3d3dc9 --- /dev/null +++ b/seasonals/snowflakes.js @@ -0,0 +1,130 @@ +const snowflakes = true; // enable/disable snowflakes +const randomSnowflakes = true; // enable random Snowflakes +const randomSnowflakesMobile = false; // enable random Snowflakes on mobile devices +const enableColoredSnowflakes = true; // enable colored snowflakes on mobile devices +const enableDiffrentDuration = true; // enable different animation duration for random symbols +const snowflakeCount = 25; // count of random extra snowflakes + + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the snowflakes +function toggleSnowflakes() { + const snowflakeContainer = document.querySelector('.snowflakes'); + if (!snowflakeContainer) 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 snowflakes if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + snowflakeContainer.style.display = 'none'; // hide snowflakes + if (!msgPrinted) { + console.log('Snowflakes hidden'); + msgPrinted = true; + } + } else { + snowflakeContainer.style.display = 'block'; // show snowflakes + if (msgPrinted) { + console.log('Snowflakes visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleSnowflakes); + +// 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) +}); + +function addRandomSnowflakes(count) { + const snowflakeContainer = document.querySelector('.snowflakes'); // get the snowflake container + if (!snowflakeContainer) return; // exit if snowflake container is not found + + console.log('Adding random snowflakes'); + + const snowflakeSymbols = ['❅', '❆']; // some snowflake symbols + const snowflakeSymbolsMobile = ['❅', '❆', '❄']; // some snowflake symbols mobile version + + for (let i = 0; i < count; i++) { + // create a new snowflake element + const snowflake = document.createElement('div'); + snowflake.classList.add('snowflake'); + + // pick a random snowflake symbol + if (enableColoredSnowflakes) { + snowflake.textContent = snowflakeSymbolsMobile[Math.floor(Math.random() * snowflakeSymbolsMobile.length)]; + } else { + snowflake.textContent = snowflakeSymbols[Math.floor(Math.random() * snowflakeSymbols.length)]; + } + + // 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() * 8; // delay (0s to 8s) + const randomAnimationDelay2 = Math.random() * 5; // delay (0s to 5s) + + // apply styles + snowflake.style.left = `${randomLeft}%`; + snowflake.style.animationDelay = `${randomAnimationDelay}s, ${randomAnimationDelay2}s`; + + // set random animation duration + if (enableDiffrentDuration) { + const randomAnimationDuration = Math.random() * 14 + 10; // delay (10s to 14s) + const randomAnimationDuration2 = Math.random() * 5 + 3; // delay (3s to 5s) + snowflake.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + // add the snowflake to the container + snowflakeContainer.appendChild(snowflake); + } + console.log('Random snowflakes added'); +} + +// initialize standard snowflakes +function initSnowflakes() { + const snowflakesContainer = document.querySelector('.snowflakes') || document.createElement("div"); + + if (!document.querySelector('.snowflakes')) { + snowflakesContainer.className = "snowflakes"; + snowflakesContainer.setAttribute("aria-hidden", "true"); + document.body.appendChild(snowflakesContainer); + } + + // Array of snowflake characters + const snowflakeSymbols = ['❅', '❆']; + + // create the 12 standard snowflakes + for (let i = 0; i < 12; i++) { + const snowflake = document.createElement('div'); + snowflake.className = 'snowflake'; + snowflake.textContent = snowflakeSymbols[i % 2]; // change between ❅ and ❆ + + // set random animation duration + if (enableDiffrentDuration) { + const randomAnimationDuration = Math.random() * 14 + 10; // delay (10s to 14s) + const randomAnimationDuration2 = Math.random() * 5 + 3; // delay (3s to 5s) + snowflake.style.animationDuration = `${randomAnimationDuration}s, ${randomAnimationDuration2}s`; + } + + snowflakesContainer.appendChild(snowflake); + } +} + +// initialize snowflakes and add random snowflakes after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!snowflakes) return; // exit if snowflakes are disabled + initSnowflakes(); + toggleSnowflakes(); + + const screenWidth = window.innerWidth; // get the screen width to detect mobile devices + if (randomSnowflakes && (screenWidth > 768 || randomSnowflakesMobile)) { // add random snowflakes only on larger screens, unless enabled for mobile devices + addRandomSnowflakes(snowflakeCount); + } +}); \ No newline at end of file diff --git a/seasonals/snowstorm.css b/seasonals/snowstorm.css new file mode 100644 index 0000000..a2057cb --- /dev/null +++ b/seasonals/snowstorm.css @@ -0,0 +1,7 @@ +.snowflake { + position: absolute; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 50%; + pointer-events: none; + opacity: 0.7; +} \ No newline at end of file diff --git a/seasonals/snowstorm.js b/seasonals/snowstorm.js new file mode 100644 index 0000000..2b0925e --- /dev/null +++ b/seasonals/snowstorm.js @@ -0,0 +1,104 @@ +const snowstorm = true; // enable/disable snowstorm +const snowflakesCount = 500; // count of snowflakes (recommended values: 300-600) +const snowFallSpeed = 4; // speed of snowfall (recommended values: 0-8) + +let msgPrinted = false; // flag to prevent multiple console messages + +// function to check and control the snowstorm +function toggleSnowstorm() { + const snowstormContainer = document.querySelector('.snowstorm'); + if (!snowstormContainer) 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 snowstorm if video/trailer player is active or dashboard is visible + if (videoPlayer || trailerPlayer || isDashboard || hasUserMenu) { + snowstormContainer.style.display = 'none'; // hide snowstorm + if (!msgPrinted) { + console.log('Snowstorm hidden'); + msgPrinted = true; + } + } else { + snowstormContainer.style.display = 'block'; // show snowstorm + if (msgPrinted) { + console.log('Snowstorm visible'); + msgPrinted = false; + } + } +} + +// observe changes in the DOM +const observer = new MutationObserver(toggleSnowstorm); + +// 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) +}); + + +function createSnowstorm() { + const container = document.querySelector('.snowstorm') || document.createElement("div"); + + if (!document.querySelector('.snowstorm')) { + container.className = "snowstorm"; + container.setAttribute("aria-hidden", "true"); + document.body.appendChild(container); + } + + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + + for (let i = 0; i < snowflakesCount; i++) { + const snowflake = document.createElement('div'); + snowflake.classList.add('snowflake'); + + // random size + const size = Math.random() * 4 + 1; + snowflake.style.width = `${size}px`; + snowflake.style.height = `${size}px`; + + // random starting position + snowflake.style.left = `${Math.random() * windowWidth}px`; + snowflake.style.top = `${Math.random() * windowHeight}px`; + + container.appendChild(snowflake); + + animateSnowflake(snowflake); + } +} + +function animateSnowflake(snowflake) { + // animation parameters + const fallSpeed = Math.random() * snowFallSpeed + 2; + const horizontalWind = Math.random() * 4 - 2; + const verticalVariation = Math.random() * 4 - 1; + + function fall() { + const currentTop = parseFloat(snowflake.style.top || 0); + const currentLeft = parseFloat(snowflake.style.left || 0); + + snowflake.style.top = `${currentTop + fallSpeed + verticalVariation}px`; + snowflake.style.left = `${currentLeft + horizontalWind}px`; + + // if snowflake is out of the window, reset its position + if (currentTop > window.innerHeight) { + snowflake.style.top = '0px'; + snowflake.style.left = `${Math.random() * window.innerWidth}px`; + } + + requestAnimationFrame(fall); + } + + fall(); +} + +// initialize snowstorm after the DOM is loaded +document.addEventListener('DOMContentLoaded', () => { + if (!snowstorm) return; // exit if snowstorm is disabled + createSnowstorm(); +}); diff --git a/seasonalsWithClass.js b/seasonalsWithClass.js deleted file mode 100644 index 1d73f13..0000000 --- a/seasonalsWithClass.js +++ /dev/null @@ -1,92 +0,0 @@ -// seasonals.js -class SeasonalThemes { - constructor() { - this.currentTheme = this.determineCurrentTheme(); - this.loadTheme(); - } - - determineCurrentTheme() { - const date = new Date(); - const month = date.getMonth(); - - // theme logic - if (month === 11 || month === 0 || month === 1) return 'winter'; // december, january, february - if (month >= 2 && month <= 4) return 'spring'; - if (month >= 5 && month <= 7) return 'summer'; - if (month >= 8 && month <= 10) return 'autumn'; - - return ''; // Fallback (nothing) - } - - loadTheme() { - const themeConfigs = { - snowflakes: { - css: 'snowflakes.css', - js: 'snowflakes.js', - containerClass: 'snowflakes' - }, - snowfall: { - js: 'snowfall.js', - containerClass: 'snowfall' - }, - snowstorm: { - css: 'snowstorm.css', - js: 'snowstorm.js', - containerClass: 'snowstorm' - }, - fireworks: { - css: 'fireworks.css', - js: 'fireworks.js', - containerClass: 'fireworks' - }, - haloween: { - css: 'haloween.css', - js: 'haloween.js', - containerClass: 'haloween' - }, - summer: { - css: 'summer.css', - js: 'summer.js', - containerClass: 'summer' - }, - autumn: { - css: 'autumn.css', - js: 'autumn.js', - containerClass: 'autumn' - }, - spring: { - css: 'spring.css', - js: 'spring.js', - containerClass: 'spring' - }, - }; - - const theme = themeConfigs[this.currentTheme]; - - // load css dynamically - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = theme.css; - document.head.appendChild(link); - - // load js dynamically - const script = document.createElement('script'); - script.src = theme.js; - document.body.appendChild(script); - - // add container class with dynamic theme class - // const container = document.createElement('div'); - // container.className = `seasonals ${theme.containerClass}`; - // document.body.appendChild(container); - - // reclassify existing container - const container = document.querySelector('.seasonals-container'); - container.className = `${theme.containerClass}`; - // container.className = theme.containerClass; - } -} - -// Initialisierung beim Laden der Seite -document.addEventListener('DOMContentLoaded', () => { - new SeasonalThemes(); -}); \ No newline at end of file