{"version":3,"sources":["btt-button.js","main.js","project-card-hover.js","svg-accents.js"],"names":["updateBttButtonColor","bttButton","document","getElementById","rect","getBoundingClientRect","elementBelow","elementFromPoint","left","top","height","parentWithBgClass","closest","classList","contains","style","color","$","ready","let","backToTopButton","addClass","on","animate","scrollTop","debounce","lastPageScrollY","window","scrollY","headerScrollTopOffset","manageHeaderState","clearTimeout","setTimeout","removeClass","hasClass","width","css","observeScrollTopChanges","evt","detail","scrolledToTop","target","prepend","getBlockDividerHtml","location","hash","linkedTab","find","length","scrollPosition","offset","parseInt","outerHeight","click","shapePath","shapeHeight","scrollDirection","headerHeight","each","this","tabId","attr","console","log","history","pushState","index","slider","sliderID","e","idx","relatedTarget","totalItems","it","i","direction","eq","appendTo","carousel","pause","state","carouselId","toggleClass","parent","trigger","social_container","after","fn","marker","margin-top","margin-bottom","position","before","IntersectionObserver","targetBoundingRect","entries","boundingClientRect","viewportBoundingRect","rootBounds","evtTrigger","nextSibling","bottom","CustomEvent","dispatchEvent","threshold","observe","get","jQuery","debouncedUpdateButtonColor","func","delay","timeout","args","context","apply","setProjectCardHoverImages","querySelectorAll","forEach","card","imagesWrapper","querySelector","mainImageContainer","hoverImageContainer","hoverImagePreload","hoverImages","JSON","parse","getAttribute","currentIndex","interval","backgroundImage","addEventListener","display","setInterval","nextIndex","clearInterval","injectSvgAccents","accentSvgs","class","svg","accentSvg","element","insertAdjacentHTML","add","parentElement","zIndex"],"mappings":"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","file":"main.js","sourcesContent":["// Function to check the background color of the element beneath the back-to-top button\r\nfunction updateBttButtonColor() {\r\n const bttButton = document.getElementById('back-to-top');\r\n const rect = bttButton.getBoundingClientRect(); // Get button position\r\n const elementBelow = document.elementFromPoint(\r\n rect.left,\r\n rect.top + rect.height\r\n ); // Get element beneath button\r\n\r\n if (elementBelow) {\r\n // Find the closest parent with a bg-color-* class\r\n const parentWithBgClass = elementBelow.closest(\r\n '.bg-color-primary, .bg-color-dark , .custom-bg-color'\r\n );\r\n\r\n // If such a parent is found, change the button color based on the class\r\n if (parentWithBgClass) {\r\n if (parentWithBgClass.classList.contains('bg-color-primary')) {\r\n bttButton.style.color = '#f3efe8';\r\n } else if (parentWithBgClass.classList.contains('bg-color-dark')) {\r\n bttButton.style.color = '#ce6739';\r\n } else if (\r\n parentWithBgClass.classList.contains('custom-bg-color')\r\n ) {\r\n bttButton.style.color = '#f3efe8';\r\n }\r\n } else {\r\n // Default styling if no background class is found\r\n bttButton.style.color = '#c74417';\r\n }\r\n }\r\n}\r\n\r\n// Debounced version of updateButtonColor\r\nconst debouncedUpdateButtonColor = debounce(updateBttButtonColor, 100); // 100ms delay\r\n\r\n// Add the scroll event listener with debounced function\r\nwindow.addEventListener('scroll', debouncedUpdateButtonColor);\r\n\r\n// Debounce function to limit how often updateButtonColor is called\r\nfunction debounce(func, delay) {\r\n let timeout;\r\n return function (...args) {\r\n const context = this;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func.apply(context, args), delay);\r\n };\r\n}\r\n","// import \"jquery-touchswipe/jquery.touchSwipe\";\r\n// import \"bootstrap\";\r\n\r\n/* eslint-disable-next-line */\r\n(function ($) {\r\n\t$(document).ready(function () {\r\n\t\t/**\r\n\t\t * Back to top button - scroll functionality\r\n\t\t */\r\n\r\n\t\tlet backToTopButton = $('#back-to-top');\r\n\r\n\t\tbackToTopButton.addClass('fade').on('click', function () {\r\n\t\t\t$('html, body').animate(\r\n\t\t\t\t{\r\n\t\t\t\t\tscrollTop: 0,\r\n\t\t\t\t},\r\n\t\t\t\t400\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Back to top button - show/hide functionality\r\n\t\t */\r\n\r\n\t\tlet debounce;\r\n\r\n\t\tlet lastPageScrollY = window.scrollY;\r\n\r\n\t\tmanageHeaderState();\r\n\r\n\t\t$(document).on('scroll', function () {\r\n\r\n\t\t\tmanageHeaderState();\r\n\r\n\t\t\t//clear the delay if it's not finished yet\r\n\t\t\tif (debounce) {\r\n\t\t\t\tclearTimeout(debounce);\r\n\t\t\t}\r\n\r\n\t\t\t//start a new delay\r\n\t\t\tdebounce = setTimeout(function () {\r\n\t\t\t\t//remove reference so another delay can start\r\n\t\t\t\tdebounce = null;\r\n\r\n\t\t\t\t// show/hide the button\r\n\t\t\t\tif ($(window).scrollTop() > 200) {\r\n\t\t\t\t\tbackToTopButton.addClass('show');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbackToTopButton.removeClass('show');\r\n\t\t\t\t}\r\n\t\t\t}, 200);\r\n\t\t});\r\n\r\n\t\tlet headerScrollTopOffset = 0;\r\n\r\n\t\tif ($(\"body\").hasClass(\"admin-bar\") && ($(window).width() > 600)) {\r\n\t\t\theaderScrollTopOffset = $(\"html\").css(\"margin-top\");\r\n\t\t}\r\n\r\n\t\t// Watch for when header is scrolled to or away from the top of the viewport\r\n\t\t// If header is scrolled to the top of the page, we know it's been stickied based on it having position: sticky\r\n\t\t// Add class when it's sitting at the top of the page, remove it when it's been scrolled away\r\n\t\t$(\"body > header.site-header-wrap\").observeScrollTopChanges(headerScrollTopOffset).on(\"scroll-top-change\", (evt) => {\r\n\r\n\t\t\tif ((evt.detail.scrolledToTop === false) && $(evt.target).hasClass(\"sticky\")) {\r\n\t\t\t\t$(evt.target).removeClass(\"sticky show\");\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t\tconst topWaveDividerPath =\r\n\t\t\t'';\r\n\r\n\t\tconst bottomWaveDividerPath =\r\n\t\t\t'';\r\n\r\n\t\t$('.orange-block.block-divider-wave-ontop').prepend(\r\n\t\t\tgetBlockDividerHtml('top', topWaveDividerPath, 50.383)\r\n\t\t);\r\n\t\t$('.orange-block.block-divider-wave-onbottom').prepend(\r\n\t\t\tgetBlockDividerHtml('bottom', bottomWaveDividerPath, 50.383)\r\n\t\t);\r\n\r\n\t\t// If the url contains a hash, it might be trying to deep link to a specific tab on the page\r\n\t\t// Scroll to and open the tab if it exists\r\n\t\t// Only applies to tabs inside a Tab block\r\n\t\tif (window.location.hash !== '') {\r\n\t\t\tconst linkedTab = $(\r\n\t\t\t\t'.tabs-block-block.has-child-page-tab-content'\r\n\t\t\t).find(\".nav-tabs a[href='\" + window.location.hash + \"']\");\r\n\r\n\t\t\tif (linkedTab.length > 0) {\r\n\t\t\t\tlet scrollPosition =\r\n\t\t\t\t\tlinkedTab.offset().top -\r\n\t\t\t\t\t(parseInt($('body > header').outerHeight()) + 30);\r\n\r\n\t\t\t\tif ($('#wpadminbar').length > 0) {\r\n\t\t\t\t\tscrollPosition -= $('#wpadminbar').outerHeight();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$('html, body').animate(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tscrollTop: scrollPosition,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t1000\r\n\t\t\t\t);\r\n\r\n\t\t\t\tlinkedTab.click();\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Updates browser's address bar by adding click tab's ID and a hash value, to simulate page navigation\r\n\t\t$('.tabs-block-block.has-child-page-tab-content').each(function () {\r\n\t\t\t$(\".nav-tabs [data-toggle='tab']\", this).on('click', function () {\r\n\t\t\t\tconst tabId = $(this).attr('href');\r\n\t\t\t\tconsole.log(tabId);\r\n\r\n\t\t\t\twindow.history.pushState(null, null, tabId);\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Carousel - Add active class to first indicator\r\n\t\t */\r\n\t\t$('.carousel-block .carousel-indicators li:first-of-type').addClass(\r\n\t\t\t'active'\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Post Slider - Bootstrap mods\r\n\t\t */\r\n\t\t$('.post-slider .carousel-inner .carousel-item:first-of-type').addClass(\r\n\t\t\t'active'\r\n\t\t);\r\n\r\n\t\t$.each($('.post-slider-block .post-slider'), function (index, slider) {\r\n\t\t\tvar sliderID = '#' + $(slider).attr('id');\r\n\t\t\t/*\r\n\t\t\t\tCC 2.0 License Iatek LLC 2018 - Attribution required\r\n\t\t\t*/\r\n\t\t\t$(this).on('slide.bs.carousel', function (e) {\r\n\t\t\t\tvar $e = $(e.relatedTarget);\r\n\t\t\t\tvar idx = $e.index();\r\n\t\t\t\tvar itemsPerSlide = 5;\r\n\t\t\t\tvar totalItems = $(sliderID + ' .carousel-item').length;\r\n\r\n\t\t\t\tif (idx >= totalItems - (itemsPerSlide - 1)) {\r\n\t\t\t\t\tvar it = itemsPerSlide - (totalItems - idx);\r\n\t\t\t\t\tfor (var i = 0; i < it; i++) {\r\n\t\t\t\t\t\t// append slides to end\r\n\t\t\t\t\t\tif (e.direction === 'left') {\r\n\t\t\t\t\t\t\t$(sliderID + ' .carousel-item')\r\n\t\t\t\t\t\t\t\t.eq(i)\r\n\t\t\t\t\t\t\t\t.appendTo(sliderID + ' .carousel-inner');\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t$(sliderID + ' .carousel-item')\r\n\t\t\t\t\t\t\t\t.eq(0)\r\n\t\t\t\t\t\t\t\t.appendTo(sliderID + ' .carousel-inner');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tfunction getBlockDividerHtml(location, shapePath, shapeHeight = 50) {\r\n\t\t\tconst dividerHtml =\r\n\t\t\t\t'
' +\r\n\t\t\t\t'' +\r\n\t\t\t\t'' +\r\n\t\t\t\tshapePath +\r\n\t\t\t\t'' +\r\n\t\t\t\t'' +\r\n\t\t\t\t'
';\r\n\r\n\t\t\treturn dividerHtml;\r\n\t\t}\r\n\r\n\t\t/* Initialize Carousel */\r\n\t\t$('.carousel.ocb').carousel({\r\n\t\t\tpause: true,\r\n\t\t});\r\n\r\n\t\t/* Play trigger */\r\n\t\t$('.carousel-control-cycle-toggle').on('click', function () {\r\n\t\t\tvar state = $(this).hasClass('oc-pause') ? 'cycle' : 'pause';\r\n\r\n\t\t\tvar carouselId = $(this).closest('.carousel').attr('id');\r\n\r\n\t\t\t$('#' + carouselId).carousel(state);\r\n\r\n\t\t\t$(this).toggleClass('oc-pause');\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Video - play video when modal opened\r\n\t\t */\r\n\t\t$('.video-block a.video-thumbnail-link').on('click', function () {\r\n\t\t\t$(this).parent().find('video').trigger('play');\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Testimonial - play/pause functionality\r\n\t\t */\r\n\t\t/*$( '.testimonial-block a.carousel-control-pause' ).on( 'click', function(){\r\n\t\t\tvar carousel = $( this ).parent().parent().attr( 'id' );\r\n\t\r\n\t\t\tif( $( this ).hasClass( 'paused' ) ) {\r\n\t\t\t\t$( '#' + carousel ).carousel('cycle');\r\n\t\t\t\t$( this ).toggleClass( 'paused' );\r\n\t\r\n\t\t\t} else {\r\n\t\t\t\t$( '#' + carousel ).carousel('pause');\r\n\t\t\t\t$( this ).toggleClass( 'paused' );\r\n\t\t\t}\r\n\t\t});*/\r\n\r\n\t\t// create function, it expects 2 values.\r\n\t\t/* eslint-disable-next-line */\r\n\t\tfunction insertAfter(newElement, targetElement) {\r\n\t\t\t// target is what you want it to go after. Look for this elements parent.\r\n\t\t\tvar parent = targetElement.parent();\r\n\t\t\t//console.log(parent);\r\n\r\n\t\t\t// if the parents lastchild is the targetElement...\r\n\t\t\tif (parent.lastChild === targetElement) {\r\n\t\t\t\t// add the newElement after the target element.\r\n\t\t\t\tparent.appendChild(newElement);\r\n\t\t\t} else {\r\n\t\t\t\t// else the target has siblings, insert the new element between the target and it's next sibling.\r\n\t\t\t\tparent.insertBefore(newElement, targetElement.nextSibling);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//need to change this to a dom listener\r\n\t\tsetTimeout(function () {\r\n\t\t\tif ($('#sb_instagram').length) {\r\n\t\t\t\tvar index = 1;\r\n\t\t\t\t$('.sbi_item').each(function () {\r\n\t\t\t\t\tvar social_container = $('.social-container');\r\n\t\t\t\t\tif (index === 2) {\r\n\t\t\t\t\t\t$(this).after(social_container);\r\n\t\t\t\t\t\tsocial_container.removeClass('hidden-unless-required');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tindex++;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, 1000);\r\n\r\n\r\n\t\tfunction manageHeaderState() {\r\n\r\n\t\t\tlet scrollDirection = (window.scrollY > lastPageScrollY) ? \"down\" : \"up\";\r\n\r\n\t\t\tlet headerHeight = $(\"body > header.site-header-wrap\").outerHeight();\r\n\r\n\t\t\tif ((window.scrollY > (headerHeight + 50)) && !$(\"body > header.site-header-wrap\").hasClass(\"sticky\")) {\r\n\r\n\t\t\t\t$(\"body > header.site-header-wrap\").addClass(\"sticky no-animation\");\r\n\r\n\t\t\t} else if ((window.scrollY <= headerHeight) && $(\"body > header.site-header-wrap\").hasClass(\"sticky\") && !$(\"body > header.site-header-wrap\").hasClass(\"show\")) {\r\n\r\n\t\t\t\t$(\"body > header.site-header-wrap\").removeClass(\"sticky no-animation\");\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ((scrollDirection === \"up\") && (window.scrollY > (headerHeight + 50)) && !$(\"body > header.site-header-wrap\").hasClass(\"show\")) {\r\n\r\n\t\t\t\t$(\"body > header.site-header-wrap\").removeClass(\"no-animation\").addClass(\"show\");\r\n\r\n\t\t\t} else if ((scrollDirection === \"down\")) {\r\n\r\n\t\t\t\tif ($(\"body > header.site-header-wrap\").hasClass(\"show\")) {\r\n\t\t\t\t\t$(\"body > header.site-header-wrap\").removeClass(\"show\");\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlastPageScrollY = window.scrollY;\r\n\r\n\t\t};\r\n\r\n\t});\r\n\r\n\t// Fires event when element has scrolled up to or away from the top of it's parent\r\n\t$.fn.observeScrollTopChanges = function (offset = 0) {\r\n\r\n\t\t// Top and bottom margin values position marker element at the top of the box area of the current element, regardless of it's top margin\r\n\t\t// Need to increase bottom margin's negative value by 1px to compensate for marker's height\r\n\t\t// Essentially makes the marker invisible\r\n\t\tconst marker = $(\"
\").css({\r\n\t\t\t\"margin-top\": this.css(\"marginTop\"),\r\n\t\t\t\"margin-bottom\": ((parseInt(this.css(\"marginTop\")) + 1) * -1),\r\n\t\t\t\"height\": \"1px\",\r\n\t\t});\r\n\r\n\t\tif (parseInt(offset) > 0) {\r\n\t\t\tmarker.css({\r\n\t\t\t\t\"position\": \"relative\",\r\n\t\t\t\t\"top\": ((parseInt(offset) + 1) * -1),\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Add to DOM before element being observed\r\n\t\t// When marker is hidden beyond the top of the viewport, the target element will be touching the top of the viewport\r\n\t\tthis.before(marker);\r\n\r\n\t\t// Create observer object\r\n\t\tconst scrollTopObserver = new IntersectionObserver((entries) => {\r\n\r\n\t\t\t// Width, height and scroll position of element being observed\r\n\t\t\tconst targetBoundingRect = entries[0].boundingClientRect;\r\n\t\t\t// Width height and position of viewport\r\n\t\t\tconst viewportBoundingRect = entries[0].rootBounds;\r\n\r\n\t\t\t// The element that should have the event triggered on it\r\n\t\t\t// Basically, the element that we want to know when it has reached the top of the page on scroll\r\n\t\t\tconst evtTrigger = entries[0].target.nextSibling;\r\n\r\n\t\t\tlet scrolledToTop = false;\r\n\r\n\t\t\t// If the entire marker element has scrolled beyond the top of the viewport\r\n\t\t\tif (targetBoundingRect.bottom < viewportBoundingRect.top) {\r\n\r\n\t\t\t\tscrolledToTop = true;\r\n\r\n\t\t\t\t// If the entire marker element is visible again\r\n\t\t\t} else if (targetBoundingRect.bottom >= viewportBoundingRect.top) {\r\n\r\n\t\t\t\tscrolledToTop = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Create custom event and pass information about whether the element was just hit the top of the page or if it is being scrolled away\r\n\t\t\tconst evt = new CustomEvent(\"scroll-top-change\", { detail: { scrolledToTop: scrolledToTop } });\r\n\r\n\t\t\tevtTrigger.dispatchEvent(evt);\r\n\r\n\t\t\t// Threshold says how much of the element needs to be visible before checking for intersection\r\n\t\t\t// 0 means as soon as any part of the element is visible\r\n\t\t}, { threshold: [0] });\r\n\r\n\t\t// Start observing the marker element\r\n\t\tscrollTopObserver.observe(marker.get(0));\r\n\r\n\t\t// Return current element to allow for jQuery function chaining\r\n\t\treturn this;\r\n\r\n\t};\r\n\r\n\t/* eslint-disable-next-line */\r\n})(jQuery);\r\n","// This function shows the hover images on the project cards when the card is hovered. It's used on the Featured projects block and the project archive page.\r\nfunction setProjectCardHoverImages() {\r\n // Select all project-cards\r\n const projectCards = document.querySelectorAll('.project-card');\r\n\r\n // Iterate over each card\r\n projectCards.forEach((card) => {\r\n // Check if the element has hover images\r\n if (card.classList.contains('has-hover-images')) {\r\n const imagesWrapper = card.querySelector('.card-image-wrapper');\r\n const mainImageContainer = card.querySelector('.main-image');\r\n const hoverImageContainer = card.querySelector('.hover-image');\r\n const hoverImagePreload = card.querySelector('.image-preload');\r\n\r\n // Get the images from the data attributes\r\n const hoverImages = JSON.parse(\r\n imagesWrapper.getAttribute('data-hover-images')\r\n );\r\n\r\n let currentIndex = 0;\r\n let interval;\r\n\r\n // set the first hover image\r\n hoverImageContainer.style.backgroundImage = `url(${hoverImages[currentIndex]})`;\r\n\r\n // if the second hover image exists, preload it\r\n if (hoverImages.length > 1) {\r\n hoverImagePreload.style.backgroundImage = `url(${\r\n hoverImages[currentIndex + 1]\r\n })`;\r\n }\r\n\r\n // on hover show the hover images\r\n card.addEventListener('mouseenter', function () {\r\n mainImageContainer.style.display = 'none';\r\n hoverImageContainer.style.display = 'block';\r\n\r\n interval = setInterval(() => {\r\n currentIndex = (currentIndex + 1) % hoverImages.length;\r\n nextIndex = (currentIndex + 1) % hoverImages.length;\r\n\r\n hoverImageContainer.style.backgroundImage = `url(${hoverImages[currentIndex]})`;\r\n hoverImagePreload.style.backgroundImage = `url(${hoverImages[nextIndex]})`;\r\n }, 1300);\r\n });\r\n\r\n card.addEventListener('mouseleave', function () {\r\n clearInterval(interval);\r\n\r\n hoverImageContainer.style.display = 'none';\r\n mainImageContainer.style.display = 'block';\r\n\r\n // reset the index\r\n currentIndex = 0;\r\n\r\n //reset the first hover image\r\n hoverImageContainer.style.backgroundImage = `url(${hoverImages[currentIndex]})`;\r\n });\r\n }\r\n });\r\n}\r\n","(function ($) {\r\n $(document).ready(function () {\r\n injectSvgAccents();\r\n });\r\n})(jQuery);\r\n\r\nconst accentSvgs = [\r\n {\r\n class: '.underline1',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.underline2',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.underline3',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.underline4',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.double-underline',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.double-underline2',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.double-underline3',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.double-underline-lg',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.wavy-underline',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.wavy-underline-lg',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.wavy-underline-light',\r\n svg: `\r\n \r\n `,\r\n },\r\n {\r\n class: '.zigzag-underline-1',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.zigzag-underline-2',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.confetti',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.end-confetti',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.end-confetti-lg',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.circle1',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.circle2',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.circle3',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.circle4',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.arrow1',\r\n svg: `\r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.arrow2',\r\n svg: `\r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.arrow3',\r\n svg: `\r\n \r\n `,\r\n },\r\n {\r\n class: '.arrow4',\r\n svg: `\r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.stars',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.dashed-underline',\r\n svg: `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n {\r\n class: '.filter-circle',\r\n svg: `\r\n \r\n \r\n \r\n \r\n `,\r\n },\r\n];\r\n\r\n// Loop over the SVG accents and for each of them, inject teh SVG in all elements that have the specific class\r\nfunction injectSvgAccents() {\r\n accentSvgs.forEach((accentSvg) => {\r\n // Select all elements with the specified class but not having the 'svg-accent' class\r\n document\r\n .querySelectorAll(accentSvg.class + ':not(.svg-accent)')\r\n .forEach((element) => {\r\n // Append the SVG content\r\n element.insertAdjacentHTML('beforeend', accentSvg.svg);\r\n\r\n // Add the 'svg-accent' class\r\n element.classList.add('svg-accent');\r\n\r\n // Set parent element's z-index and position\r\n let parentElement = element.parentElement;\r\n if (parentElement) {\r\n parentElement.style.zIndex = 5;\r\n parentElement.style.position = 'relative';\r\n }\r\n });\r\n });\r\n}\r\n"]}