Alternaleaf Style Guide

Client-First V2
Typography
HTML Headings Tags
HTML tags define default Heading styles.
All H1 Headings

Heading 1

All H2 Headings

Heading 2

All H3 Headings

Heading 3

All H4 Headings

Heading 4

All H5 Headings
Heading 5
All H6 Headings
Heading 6
Heading Classes
Heading classes when typography style doesn't match the default HTML tag.
heading-style-h1
heading-style-title

Heading-style-h1

heading-style-h1

Heading-style-h1

heading-style-h2

Heading-style-h2

heading-style-h2
is-mobile-landscape-2.5rem

Heading-style-h2

heading-style-h3

Heading-style h3

heading-style-h3
is-mobile-landscape-1.125rem

Heading-style h3

heading-style-h3
is-mobile-1.125rem

Heading-style h3

heading-style-h3
is-mobile-1.5rem

Heading-style h3

heading-style-h4

Heading-style-h4

heading-style-h5

Heading-style-h5

heading-style-h6

Heading-style-h6

Other HTML Tags
HTML tags define default text styles.
All Paragraphs

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

All Links
All Links
All Block Quotes
Block Quote
All Unordered Lists
  • No bullet list

  • No bullet list

All Unordered Lists
  • No bullet list

  • No bullet list

All Ordered Lists
  1. No bullet list

  2. No bullet list

  3. No bullet list

Content Divider
  1. No bullet list

  2. No bullet list

  3. No bullet list

Placeholder
Text Sizes
Text sizes classes when typography size doesn't match the default HTML tag.
text-size-large

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-large
is-mobile-landscape-1.25rem

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-medium

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-medium
is-mobile-landscape-1.125rem

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-regular

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-small

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

text-size-tiny

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Text Weights
Text weight classes when typography weight doesn't match the default HTML tag.
text-weight-bold
text-weight-bold (700)
text-weight-semibold
text-weight-semibold (600)
text-weight-medium
text-weight-medium (500)
text-weight-normal
text-weight-normal (400)
Text Styles
Text style classes when typography style doesn't match the default HTML tag.
text-style-italic
text-style-italic
text-style-strikethrough
text-style-strikethrough
text-style-allcaps
text-style-allcaps
text-style-nowrap
text-style-nowrap
text-style-quote
Block Quote
text-style-link
text-style-link-no-underline
text-style-link-light-hover
text-style-link-hover-underline
text-style-2lines
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
text-style-3lines
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Text Span
text-style-block-mobile
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
text-style-muted
text-style-muted
text-style-base-line

Plant medicine
for a better you

Text Alignment
Text alignment classes when typography alignment doesn't match the default HTML tag.
text-align-left
text-align-left
text-align-center
text-align-center
text-align-right
text-align-right
text-align-right-mobile
text-align-right-mobile
text-align-center-mobile
text-align-center-mobile
text-align-left-mobile
text-align-left-mobile
Rich Text
blog-post-header_text-rich-text

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6
This is a block quote

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

This is a link inside of a rich text

  • List item
  • List item
  • List item
  1. List item
  2. List item
  3. List item
Caption goes here
Colors
Color Palette
is-black
is-white
is-gray
is-primary
is-secondary
is-bg-default
is-bg-cloud
is-accent
is-light-blue
is-bg-overcast
is-bg-contrast (white)
is-text-and-icons-default
is-text-and-icons-muted
is-text-and-icons-success
is-state-primary-default
is-warm-white
is-button-hover
is-button-active
is-button-border
is-alternate-hover
is-alternate-pressed
is-alternate-press
is-text-and-icons/muted-5E3B5F
is-text-and-icons/subtle-7a5e7b
is-bg-overcast
is-outline-subtle
is-outline-default
is-state/primary/press
is-state/primary/hover
is-dim-grey
Background Color
Manage recurring background colors.
background-color-black
background-color-dim-grey
background-color-white
background-color-gray
background-color-default-primary
background-color-default-primary
background-color-cloud
background-color-accent
background-color-overcast
Text Color
Manage recurring text colors.
text-color-white
text-color-white
text-color-black
text-color-black
text-color-default-primary
text-color-default-primary
text-color-secondary
text-color-secondary
text-color-text-and-icons/subtle
text-color-text-and-icons/subtle
text-color-text-and-Icons/muted
text-color-text-and-Icons/muted
text-and-icons-muted-5E3B5F
text-and-icons-muted-5E3B5F
text-color-text-and-icons/success
text-color-text-and-icons/success
Effects
Box Shadows
Shadows allow you to add depth and realism to designs by positioning elements on a z-axis.
shadow-elevation-1
shadow-elevation-2
shadow-elevation-3
shadow-elevation-4
shadow-elevation-1
shadow-elevation-2
shadow-elevation-3
shadow-elevation-4
UI Elements
Buttons
button
button
is-100
button
is-med
button
is-small
button
is-secondary
button
is-secondary
is-medium
button
is-secondary
is-small
button
is-tertiary
button
is-tertiary
is-med
button
is-tertiary
is-small
button
is-link
To use on a dark background, simple use the add-on class is-alternate
button
is-alternate
button
is-alternate
is-med
button
is-alternate
is-small
button
is-secondary
is-alternate
button
is-secondary
is-med
is-alternate
button
is-secondary
is-small
is-alternate
button
is-link
is-alternate
Button
Buttons With Icons
button
is-icon
button
is-med
is-icon
button
is-small
is-icon
button
is-secondary
is-icon
button
is-secondary
is-medium
is-icon
button
is-secondary
is-small
is-icon
button
is-link
is-icon
button
is-link
is-style-cover
button
is-icon-only
button
is-med
is-icon-only
button
is-small
is-icon-only
button
is-secondary
is-icon-only
button
is-secondary
is-med
is-icon-only
button
is-secondary
is-small
is-icon-only
button
is-tertiary
is-icon-only
button
is-tertiary
is-med
is-icon-only
button
is-tertiary
is-small
is-icon-only
button
is-link
is-icon-only
Form Elements
field-label
form-input
form-input
is-text-area
form-input
is-select-input
form-checkbox
form-radio
button
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Icons (Image)

icon-height-xxsmall

icon-height-xsmall

icon-height-small

icon-height-medium

icon-height-large

icon-height-xlarge

icon-height-custom1

icon-1x1-xxsmall

icon-1x1-xsmall

icon-1x1-small

icon-1x1-medium

icon-1x1-large

icon-1x1-xlarge

icon-1x1-custom1

Icons (HTML Embed)
HTML embed icons enable you to control icon color on hover.

icon-embed-xxsmall

icon-embed-xsmall

icon-embed-small

icon-embed-medium

icon-embed-large

icon-embed-xlarge

icon-embed-custom1

Structure Classes
Defined and flexible core structure we can use on all or most pages.
page-wrapper
main-wrapper
container-small
container-medium
container-medium
is-wider
container-large
padding-global
padding-section-small
padding-section-medium
padding-section-medium
is-less
padding-section-medium
padding-bottom-mobile-landscape-2.5rem
padding-section-large
padding-section-large
padding-bottom-0
button-group
button-group
align-center-flex
button-group
gap-half
button-group
is-404
button-group
is-vertical
Max Widths
Use the max-width CSS property to contain inner content to a maximum width.
max-width-full
max-width-full-tablet
max-width-full-mobile-landscape
max-width-full-mobile-portrait
max-width-xxlarge
max-width-xlarge
max-width-large
max-width-large
max-width-42rem
max-width-medium
max-width-38rem
max-width-medium
max-width-36rem
max-width-medium
max-width-small
max-width-32rem
max-width-small
max-width-small
max-width-22rem
max-width-small
max-width-20rem
max-width-small
max-width-18rem
max-width-xsmall
max-width-xxsmall
Paddings
Direction Classes
padding-bottom
padding-top
padding-vertical
padding-horizontal
padding-left
padding-right
Size Classes
padding-0
padding-tiny
padding-xxsmall
padding-xsmall
padding-small
padding-medium
padding-large
padding-xlarge
padding-xxlarge
padding-huge
padding-xhuge
padding-xxhuge
padding-custom1
padding-custom2
padding-custom3
Margins
Direction Classes
margin-bottom
margin-top
margin-vertical
margin-horizontal
margin-left
margin-right
Size Classes
margin-0
margin-tiny
margin-xxsmall
margin-xsmall
margin-small
margin-medium
margin-large
margin-xlarge
margin-xxlarge
margin-huge
margin-xhuge
margin-xxhuge
margin-custom1
margin-custom2
margin-custom3
Spacers
Unified spacer system for the project.
spacer-tiny
spacer-xxsmall
spacer-xsmall
spacer-xsmall
is-mobile-0.94rem
spacer-xsmall
is-mobile-landscape-0.25rem
spacer-small
spacer-small
is-1rem-mobile-landscape
spacer-medium
spacer-medium
is-2.5rem
spacer-medium
is-mobile-2.5rem
spacer-medium
is-mobile-landscape-1.5rem
spacer-large
spacer-large
is-mobile-landscape-1.5rem
spacer-xlarge
spacer-xlarge
is-mobile-1.5rem
spacer-xlarge
is-4.5rem
spacer-xxlarge
spacer-huge
spacer-xhuge
spacer-xxhuge
Utility Classes
Useful utility classes we like to use in most of our projects to build faster.
hide
This element is hidden
hide-desktop
hide-desktop-only
hide-tablet
hide-mobile-portrait
hide-mobile-landscape
overflow-visible
overflow-hidden
overflow-auto
overflow-scroll
pointer-events-on
pointer-events-off
layer
div-square
spacing-clean
align-center
z-index-1
z-index-2
display-inlineflex
margin-top-auto
Max Widths
Use the max-width CSS property to contain inner content to a maximum width.
max-width-full
max-width-full-tablet
max-width-full-mobile-landscape
max-width-full-mobile-portrait
max-width-xxlarge
max-width-xlarge
max-width-large
max-width-medium
max-width-small
max-width-xsmall
max-width-xxsmall
Custom Codes
Global Codes
Reviews and Cannaverse sliders
<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>
<script>
$(".swiper").append(`<div class="swiper-scrollbar"></div>`);
$(".swiper").append(`<div class="swiper-pagination"></div>`);
$(".swiper").append(`<div class="swiper-arrow button-prev"></div>`);
$(".swiper").append(`<div class="swiper-arrow button-next"></div>`);

const swiper2 = new Swiper(".is-swiper-slider", {
  // Optional parameters
  direction: "horizontal",
  a11y: true,
  loop: true,
  slidesPerView: 2,
  slidesPerGroup: 2,
  spaceBetween: 20,
  loop: false,
  parallax: true,
  centeredSlides: false,
  mousewheel: {
    forceToAxis: true
  },
  keyboard: {
      enabled: true
    },
  speed: 600,
  // Responsive breakpoints
  breakpoints: {
    // when window width is >= 0px
     0: {
      slidesPerView: 1,
      slidesPerGroup: 1
    },
    
    // when window width is >= 480px
    480: {
      slidesPerView: 1,
      slidesPerGroup: 1
    },
    // when window width is >= 768px
    768: {
      slidesPerView: 2,
      slidesPerGroup: 2
    },
    // when window width is >= 992px
    992: {
      slidesPerView: 2,
      slidesPerGroup: 2
    }
  },

  // Navigation arrows
  navigation: {
    nextEl: ".button-next",
    prevEl: ".button-prev"
  },

  // And if we need scrollbar
  scrollbar: {
    el: ".swiper-scrollbar",
    draggable: true
  }
});
</script>
Heading Strokes
<script>
//Heading Span Stroke
$(document).ready(function() {
    $('.text-style-base-line').each(function() {
        // Find the nearest image's src that is a sibling to the parent heading of the span
        let imageUrl = $(this).closest('h1, h2, h3, h4, h5, h6').siblings('img').attr('src');

        // If such an image exists and has a src, set it as the background
        if (imageUrl) {
            $(this).css('background-image', 'url(' + imageUrl + ')');
        }
    });
});
</script>
Navbar Mechanism
<script>

// Sticky Navbar Mechanism
// Get the navbar
var navbar = document.querySelector(".navbar_component");
var delayTimeout; // Keep a reference to the timeout so you can clear it

// Event handler for viewport > 991
function largeViewportHandler() {
  clearTimeout(delayTimeout); // Clear any existing timeout

  if (window.scrollY > 120 && window.scrollY <= 500) {
    // Set a delay to add the class
    delayTimeout = setTimeout(function() {
      navbar.classList.add("is-sticky");
    }, 500); // 500ms delay for demonstration, change as required
  } else if (window.scrollY <= 120) {
    navbar.classList.remove("is-sticky");
  } else if (window.scrollY > 500) {
    navbar.classList.add("is-sticky");
  }
}

// Event handler for viewport <= 991
function smallViewportHandler() {
  clearTimeout(delayTimeout); // Clear any existing timeout

  if (window.scrollY > 50 && window.scrollY <= 500) {
    // Set a delay to add the class
    delayTimeout = setTimeout(function() {
      navbar.classList.add("is-sticky");
    }, 500); // 500ms delay for demonstration, change as required
  } else if (window.scrollY <= 50) {
    navbar.classList.remove("is-sticky");
  } else if (window.scrollY > 500) {
    navbar.classList.add("is-sticky");
  }
}

// Attach the appropriate handler based on the viewport size
window.addEventListener("scroll", function() {
  if (window.innerWidth > 991) {
    largeViewportHandler();
  } else {
    smallViewportHandler();
  }
});

//Navbar menu button interaction
$('.navbar_menu-button').on('click', function() {
  console.log("Button clicked!"); // Add this line
  $('.navbar_container').toggleClass('is-open');
  $('body').toggleClass('overflow-hidden');
});

</script>
Dynamic year values in "© 2023 Alternaleaf. All rights reserved."
<script defer>
//Dynamic year values in "© 2023 Alternaleaf. All rights reserved."
$(function() {
  $('.current-year').text(new Date().getFullYear());
});
</script>
Home Page & Consult Page
Number Counter
<script>
    jQuery(document).ready(function( $ ) {
        $("[fs-numbercount-element='number-1']").counterUp({
            delay: 10, // the delay time in ms
            time: 2000 // the speed time in ms
        });

        $("[fs-numbercount-element='number-2']").counterUp({
            delay: 10, // the delay time in ms
            time: 2000 // the speed time in ms
        });
    });
</script>
    
Blog & Categories
Blog Category Search Functionality
<script>
$(document).ready(function() {
  var searchInput = $("[data-blog-category='search']");
  var sectionBlog = $("[data-blog-category='section']");
  var recentArticleHeading = $("[data-blog-category='recent-article-heading']");

  searchInput.keyup(function() {
    var inputValue = $(this).val();
    
    if (inputValue.length > 0) {
      sectionBlog.css({ height: "0px", opacity: 0 });
      recentArticleHeading.css({ display: 'none' });
    } else {
      sectionBlog.css({ height: "auto", opacity: 1 });
      recentArticleHeading.css({ display: 'block' });
    }
  });
});

// Assuming you have jQuery loaded on your page
$(document).ready(function() {
  // Find the parent element with class .cannaverse-header_info-radio
  var parentElement = $('.cannaverse-header_info-radio');

  // Find the child element with class .cannaverse-header_info-item within the parent
  var childElement = parentElement.find('.cannaverse-header_info-item');

  // Click on the child element
  childElement.click();
});

</script>
Blog
Blog Recommender
<script>
document.addEventListener("DOMContentLoaded", function () {
  const triggerElements = document.querySelectorAll(
    "[data-trigger], [data-trigger-final]"
  );

  triggerElements.forEach(function (element) {
    element.addEventListener("click", function () {
      const triggerValue =
        element.getAttribute("data-trigger") ||
        element.getAttribute("data-trigger-final");
      const targetElements = document.querySelectorAll(
        "[data-target], [data-target-final]"
      );

      targetElements.forEach(function (targetElement) {
        const targetAttributeValue =
          targetElement.getAttribute("data-target") ||
          targetElement.getAttribute("data-target-final");

        if (targetAttributeValue === triggerValue) {
          targetElement.style.display = "block"; // Show matched elements using flex
        } else {
          targetElement.style.display = "none"; // Hide non-matched elements
        }
      });
    });
  });
});

document.addEventListener("DOMContentLoaded", function () {
  const triggerElements = document.querySelectorAll(
    "[data-trigger], [data-trigger-final], [data-trigger-style='short'], [data-btn='edit'], [data-form='back-btn']"
  );
  const quizListElement = document.querySelector(".cannaverse-quiz_quiz-list");

  triggerElements.forEach(function (element) {
    element.addEventListener("click", function () {
      if (
        element.getAttribute("data-btn") === "edit" ||
        element.getAttribute("data-form") === "back-btn"
      ) {
        quizListElement.classList.remove("is-step-2", "is-step-3", "is-small");
      } else {
        if (element.getAttribute("data-trigger")) {
          quizListElement.classList.add("is-step-2");
        }

        if (element.getAttribute("data-trigger-final")) {
          quizListElement.classList.add("is-step-3");
          quizListElement.classList.remove("is-small");
        }

        if (element.getAttribute("data-trigger-style") === "short") {
          quizListElement.classList.add("is-step-2", "is-small");
        }
      }
    });
  });
});
</script>
Blog Articles
Blog Recommender
<script>
const element = document.querySelector("[data-article='breadcrumb-article-name']");

if (element && element.innerText.length > 10) {
    element.innerText = element.innerText.substring(0, 10) + '...';
}
</script>
Faq
Faq Anchoring Feature
<script>
    // Wait for the document to be ready
    $(document).ready(function() {
        // Find the first element with the attribute data-faq-accordion
        var firstAccordion = $('[data-faq-accordion]').first();

        // Find the child element with the attribute data-faq-question and simulate a click
        var questionElement = firstAccordion.find('[data-faq-question]').first();
        questionElement.click();
    }); 
    
//FAQ functionality
document.addEventListener("DOMContentLoaded", function () {
  const anchorLinks = document.querySelectorAll("[data-faq-anchor-link]");
  const categories = document.querySelectorAll("[data-faq-category]");

  // Set the 'is-current' class to the first button by default
  if (anchorLinks[0]) {
    anchorLinks[0].classList.add("is-current");
  }

  function resetButtonActiveState() {
    anchorLinks.forEach((link) => {
      link.classList.remove("is-current");
    });
  }

  function updateButtonActiveState() {
    let closestCategoryIndex = -1;
    let closestCategoryDistance = Infinity;

    categories.forEach((category, index) => {
      const rect = category.getBoundingClientRect();
      if (rect.top >= -140 && rect.top < closestCategoryDistance) {
        closestCategoryDistance = rect.top;
        closestCategoryIndex = index;
      }
    });

    if (closestCategoryIndex > -1) {
      resetButtonActiveState();
      anchorLinks[closestCategoryIndex].classList.add("is-current");
    }
  }

  // Adjust active state based on scrolling
  window.addEventListener("scroll", updateButtonActiveState);

  // Button click functionality
  anchorLinks.forEach((link, index) => {
    link.addEventListener("click", function () {
      if (categories[index]) {
        const targetPosition =
          categories[index].getBoundingClientRect().top +
          window.pageYOffset -
          140;
        window.scrollTo(0, targetPosition);

        // Wait for the scroll to complete, then update the button active state
        setTimeout(() => {
          updateButtonActiveState();
        }, 140); // Assuming it takes less than 160ms to scroll. Adjust if needed.
      }
    });
  });

  // Update button states initially
  updateButtonActiveState();
});
</script>
Patient Referral
File Download Functionality
<script>
//direct file download
const downloadLinks = document.querySelectorAll('[data-download-file="link"]');

downloadLinks.forEach(link => {
  link.addEventListener('click', e => {
    e.preventDefault();
    const url = link.getAttribute('href');
    const fileName = link.getAttribute('data-file-name');
    const originalText = link.innerText;
    link.innerText = 'Downloading...';
    link.disabled = true;
    fetch(url)
      .then(response => response.blob())
      .then(blob => {
        const downloadLink = document.createElement('a');
        downloadLink.setAttribute('href', URL.createObjectURL(blob));
        downloadLink.setAttribute('download', fileName);
        downloadLink.setAttribute('target', '_blank');
        downloadLink.style.display = 'none';
        document.body.appendChild(downloadLink);
        downloadLink.click();
        link.innerText = originalText;
        link.disabled = false;
        setTimeout(() => {
          document.body.removeChild(downloadLink);
        }, 100);
      });
  });
});
</script>
Custom JavaScript repositories
Finsweet CMS Sort
<!-- [Attributes by Finsweet] CMS Sort -->
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmssort@1/cmssort.js"></script>
Finsweet CMS Filter
<!-- [Attributes by Finsweet] CMS Filter -->
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsfilter@1/cmsfilter.js"></script>
Finsweet Disable scrolling
<!-- [Attributes by Finsweet] Disable scrolling -->
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-scrolldisable@1/scrolldisable.js"></script>
Finsweet CMS Filter
<!-- [Attributes by Finsweet] Disable scrolling -->
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-scrolldisable@1/scrolldisable.js"></script>
DIY(How to)
FAQs
How to add FAQs
Toggle to preview and watch the videos
How to edit and add FAQ categories.
Custom Classes
🔴  Do Not Delete 
text block