1/*! 2 * Immediately Invoked Function Expression Boilerplate 3 * (c) 2019 Chris Ferdinandi, MIT License, https://gomakethings.com 4 */ 5;(function () { 6 7 'use strict'; 8 9 // Element variables 10 const menuToggle = document.querySelector('.menu-toggle'); 11 const siteHeader = document.querySelector('.site-header'); 12 const headerSearch = document.querySelector('.header-search'); 13 const navMenu = document.querySelector('.nav-menu[role="navigation"]'); 14 const searchToggles = document.querySelectorAll('.search-toggle'); 15 const searchField = document.querySelector('.header-search .wp-block-search__input'); 16 17 const elementExists = function(element) { 18 if ( typeof(element) != 'undefined' && element != null ) { 19 return true; 20 } 21 return false; 22 } 23 24 // Event functions 25 const toggleMenu = function(event) { 26 if ( !event.target.closest('.menu-toggle') ) return; 27 if ( elementExists(searchToggles) && searchToggles.length ) { 28 for (let searchToggle of searchToggles) { 29 searchToggle.classList.remove('active'); 30 } 31 } 32 if ( elementExists(headerSearch) ) { 33 headerSearch.classList.remove('active'); 34 } 35 if ( elementExists(navMenu) ) { 36 navMenu.classList.toggle('active'); 37 } 38 menuToggle.classList.toggle('active'); 39 siteHeader.classList.toggle('menu-active'); 40 } 41 42 const toggleSubMenu = function(event) { 43 if ( !event.target.closest('.submenu-expand') ) return; 44 event.target.closest('.submenu-expand').classList.toggle('expanded'); 45 event.target.closest('.menu-item').classList.toggle('has-expanded-submenu'); 46 event.preventDefault(); 47 } 48 49 const toggleSearch = function(event) { 50 if ( !event.target.closest('.search-toggle') ) return; 51 if ( elementExists(menuToggle) ) { 52 menuToggle.classList.remove('active'); 53 } 54 if ( elementExists(navMenu) ) { 55 navMenu.classList.remove('active'); 56 siteHeader.classList.remove('menu-active'); 57 } 58 if ( cwp.search === 'slickstream' ) { 59 document.dispatchEvent(new CustomEvent('slick-show-discovery')); 60 } else { 61 if ( elementExists(headerSearch) ) { 62 for( let searchToggle of searchToggles ) { 63 searchToggle.classList.toggle('active'); 64 } 65 headerSearch.classList.toggle('active'); 66 if ( elementExists(searchField) ) { 67 searchField.focus(); 68 } 69 } 70 } 71 } 72 73 const closeSearch = function(event) { 74 if ( event.target.closest('#grow-me-root') ) { 75 if ( elementExists(headerSearch) ) { 76 for( let searchToggle of searchToggles ) { 77 searchToggle.classList.remove('active'); 78 } 79 headerSearch.classList.remove('active'); 80 } 81 } 82 } 83 84 const toggleFave = function(event) { 85 if ( !event.target.closest('.favorite-toggle') ) return; 86 if ( cwp.favorites === 'slickstream' ) { 87 document.dispatchEvent(new CustomEvent('slick-show-discovery', { detail: { page: 'favorites' } })); 88 } 89 } 90 91 // Yoast FAQ Toggle 92 const yoastFaqs = document.querySelectorAll('.schema-faq'); 93 if ( yoastFaqs.length ) { 94 for( let [faqIndex, faq] of yoastFaqs.entries() ) { 95 faq.classList.add('schema-faq--has-toggle'); 96 let questions = faq.querySelectorAll('.schema-faq-question'); 97 if ( questions.length ) { 98 for( let [questionIndex, question] of questions.entries() ) { 99 let btn = document.createElement('button'); 100 btn.setAttribute('aria-label', 'Display answer'); 101 btn.classList.add('schema-faq-toggle'); 102 question.append(btn); 103 question.style.cursor = 'pointer'; 104 105 // Close all faqs by default. 106 question.closest('.schema-faq-section').querySelector('.schema-faq-answer').toggleAttribute('hidden'); 107 108 // Open all faqs by default. 109 // question.closest('.schema-faq-section').classList.toggle('active'); 110 111 // Open first faq question in each faq block. 112 // if ( questionIndex !== 0 ) { 113 // question.closest('.schema-faq-section').querySelector('.schema-faq-answer').toggleAttribute('hidden'); 114 // } else { 115 // question.closest('.schema-faq-section').classList.toggle('active'); 116 // } 117 } 118 } 119 } 120 } 121 122 const faqToggle = function(event) { 123 if( !event.target.closest('.schema-faq-question') ) return; 124 let parent = event.target.closest('.schema-faq-section'); 125 parent.classList.toggle('active'); 126 parent.querySelector('.schema-faq-answer').toggleAttribute('hidden'); 127 } 128 129 // Add functions to click event listener 130 document.addEventListener('click', function(event) { 131 toggleMenu(event); 132 toggleSubMenu(event); 133 toggleSearch(event); 134 closeSearch(event); 135 toggleFave(event); 136 faqToggle(event); 137 }); 138 139 // Grow JS 140 function initGrowMeSdk() { 141 if (!window.growMe) { 142 window.growMe = function (e) { 143 window.growMe._.push(e); 144 } 145 window.growMe._ = []; 146 } 147 } 148 149 let isBookmarked = null; 150 initGrowMeSdk(); 151 window.growMe(() => { 152 isBookmarked = window.growMe.getIsBookmarked(); 153 window.growMe.on("isBookmarkedChanged", (params) => { 154 isBookmarked = params.isBookmarked; 155 if ( isBookmarked ) { 156 document.querySelector('.post-header__favorite').classList.add('active'); 157 } 158 }); 159 }); 160 161 async function callAddBookmark() { 162 try { 163 await window.growMe.addBookmark({ 164 source: "create", 165 tooltipReferenceElement: document.querySelector(".post-header__favorite") 166 }); 167 } catch (e) { 168 // Handle Error 169 } 170 } 171 172 document.addEventListener( 'click', function(event) { 173 if ( !event.target.closest('.post-header__favorite') ) return; 174 if ( ! window.growMe.getIsBookmarked() ) { 175 callAddBookmark(); 176 } 177 }); 178 179 // Slickstream JS 180 const sr = document.querySelectorAll('.post-header__favorite'); 181 182 // This returns the Slickstream API object, 183 // waiting if necessary for loading to complete 184 185 async function ensureSlickstream() { 186 if (window.slickstream) { 187 return window.slickstream.v1; 188 } 189 return new Promise((resolve, reject) => { 190 document.addEventListener('slickstream-ready', () => { 191 resolve(window.slickstream.v1); 192 }); 193 }); 194 } 195 196 async function updateFavoriteButtonState() { 197 const slickstream = await ensureSlickstream(); 198 const isFavorite = slickstream.favorites.getState(); 199 for( var i = 0, len = sr.length; i < len; i++ ) { 200 if ( slickstream.favorites.getState() ) { 201 sr[i].classList.add('active'); 202 } else { 203 sr[i].classList.remove('active'); 204 } 205 } 206 } 207 208 for( var i = 0, len = sr.length; i < len; i++ ) { 209 sr[i].addEventListener( 'click', function(e) { 210 e.preventDefault(); 211 }); 212 sr[i].addEventListener('click', async() => { 213 const slickstream = await ensureSlickstream(); 214 const state = slickstream.favorites.getState(); 215 slickstream.favorites.setState(!state); 216 }); 217 } 218 219 // If the favorite state has changed this event will fire and 220 // this ensures your display of the state remains correct 221 document.addEventListener('slickstream-favorite-change', () => { 222 updateFavoriteButtonState(); 223 }); 224 // After the page loads, this will ensure your display 225 // is updated as soon as the info is available 226 updateFavoriteButtonState(); 227 228}
vendor: 5 bytes, line 228
228)();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.