1(function () { 2 'use strict'; 3 4 function initSlider(root) { 5 var viewport = root.querySelector('.lara-footer-reviews__viewport'); 6 var track = root.querySelector('.lara-footer-reviews__track'); 7 var prevBtn = root.querySelector('[data-lara-reviews-prev]'); 8 var nextBtn = root.querySelector('[data-lara-reviews-next]'); 9 var cards = Array.prototype.slice.call(track.children); 10 11 if (!cards.length) { 12 return; 13 } 14 15 var index = 0; 16 17 function visibleCount() { 18 return window.matchMedia('(max-width: 767px)').matches ? 1 : 4; 19 } 20 21 function maxIndex() { 22 return Math.max(0, cards.length - visibleCount()); 23 } 24 25 function update() { 26 var max = maxIndex(); 27 if (index > max) { 28 index = max; 29 } 30 var cardWidth = cards[0].getBoundingClientRect().width; 31 var gap = parseFloat(window.getComputedStyle(track).columnGap || window.getComputedStyle(track).gap || 0) || 0; 32 track.style.transform = 'translateX(-' + (index * (cardWidth + gap)) + 'px)'; 33 34 prevBtn.disabled = index <= 0; 35 nextBtn.disabled = index >= max; 36 } 37 38 prevBtn.addEventListener('click', function () { 39 index = Math.max(0, index - 1); 40 update(); 41 }); 42 43 nextBtn.addEventListener('click', function () { 44 index = Math.min(maxIndex(), index + 1); 45 update(); 46 }); 47 48 window.addEventListener('resize', update); 49 update(); 50 } 51 52 function initReviewModal() { 53 var modal = document.querySelector('[data-lara-review-modal]'); 54 if (!modal) { 55 return; 56 } 57 58 var closers = modal.querySelectorAll('[data-lara-review-modal-close]'); 59 var avatarEl = modal.querySelector('[data-lara-review-modal-avatar]'); 60 var authorEl = modal.querySelector('[data-lara-review-modal-author]'); 61 var dateEl = modal.querySelector('[data-lara-review-modal-date]'); 62 var starsEl = modal.querySelector('[data-lara-review-modal-stars]'); 63 var textEl = modal.querySelector('[data-lara-review-modal-text]'); 64 var lastTrigger = null; 65
66 function renderStars(rating) { 67 starsEl.innerHTML = ''; 68 rating = parseInt(rating, 10) || 0; 69 for (var i = 0; i < 5; i++) { 70 var star = document.createElement('span'); 71 star.className = 'lara-review-modal__star' + (i < rating ? ' is-filled' : ''); 72 star.textContent = 'â '; 73 starsEl.appendChild(star); 74 if (i < 4) { 75 starsEl.appendChild(document.createTextNode(' ')); 76 } 77 } 78 } 79 80 function onKeydown(e) { 81 if (e.key === 'Escape' || e.keyCode === 27) { 82 closeModal(); 83 } 84 } 85 86 function openModal(trigger) { 87 var data = trigger.dataset; 88 89 authorEl.textContent = data.laraReviewAuthor || ''; 90 dateEl.textContent = data.laraReviewDate || ''; 91 textEl.textContent = data.laraReviewText || ''; 92 renderStars(data.laraReviewRating); 93 94 avatarEl.innerHTML = ''; 95 if (data.laraReviewAvatar) { 96 var img = document.createElement('img'); 97 img.src = data.laraReviewAvatar; 98 img.alt = ''; 99 img.loading = 'lazy'; 100 avatarEl.appendChild(img); 101 } 102 103 lastTrigger = trigger; 104 modal.hidden = false; 105 modal.classList.add('is-open'); 106 document.body.classList.add('lara-review-modal-open'); 107 document.addEventListener('keydown', onKeydown); 108 closers[0].focus(); 109 } 110 111 function closeModal() { 112 modal.classList.remove('is-open'); 113 modal.hidden = true; 114 document.body.classList.remove('lara-review-modal-open'); 115 document.removeEventListener('keydown', onKeydown); 116 117 if (lastTrigger) { 118 lastTrigger.focus(); 119 lastTrigger = null; 120 } 121 } 122 123 Array.prototype.forEach.call(closers, function (btn) { 124 btn.addEventListener('click', closeModal); 125 }); 126 127 var triggers = document.querySelectorAll('[data-lara-review-trigger]'); 128 Array.prototype.forEach.call(triggers, function (trigger) { 129 trigger.addEventListener('click', function () { 130 openModal(trigger); 131 }); 132 133 trigger.addEventListener('keydown', function (e) { 134 if (e.key === 'Enter' || e.key === ' ' || e.keyCode === 13 || e.keyCode === 32) { 135 e.preventDefault(); 136 openModal(trigger); 137 } 138 }); 139 }); 140 } 141 142 document.addEventListener('DOMContentLoaded', function () { 143 var sliders = document.querySelectorAll('[data-lara-reviews-slider]'); 144 Array.prototype.forEach.call(sliders, initSlider); 145 146 initReviewModal(); 147 }); 148})();
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.