PageSourceSearch

https://muebles-lara.es/modules/laragooglereviews/views/js/laragooglereviews-footer-slider.js

js muebles-lara.es collected 2026-10-05 19:41:13 UTC 4,507 bytes, 148 lines download raw bytes

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.