PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.14
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.14
2.0.14 2.0.13 2.0.12 2.0.11 2.0.10 2.0.9 trunk 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8
blockenberg / blocks / gallery-showcase / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.14, at blocks/gallery-showcase/frontend.js

178 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 'use strict';
3
4 document.querySelectorAll('.bkbg-gs-wrapper').forEach(function (wrap) {
5 var mainEl = wrap.querySelector('.bkbg-gs-main');
6 if (!mainEl) {
7 return;
8 }
9
10 var slides = [].slice.call(wrap.querySelectorAll('.bkbg-gs-slide'));
11 var thumbBtns = [].slice.call(wrap.querySelectorAll('.bkbg-gs-thumb'));
12 var prevBtn = wrap.querySelector('.bkbg-gs-arrow--prev');
13 var nextBtn = wrap.querySelector('.bkbg-gs-arrow--next');
14 var counter = wrap.querySelector('.bkbg-gs-counter');
15 var caption = wrap.querySelector('.bkbg-gs-caption');
16 var belowCap = wrap.querySelector('.bkbg-gs-below-caption');
17 var lbTrigger = wrap.querySelector('.bkbg-gs-lightbox-trigger');
18 var enableLb = wrap.getAttribute('data-lightbox') === '1';
19 var enableKbd = wrap.getAttribute('data-keyboard') === '1';
20
21 var current = 0;
22 var total = slides.length;
23 if (!total) {
24 return;
25 }
26
27 var captions = slides.map(function (s) {
28 var img = s.querySelector('img');
29 return (img && img.getAttribute('data-caption')) || (img && img.alt) || '';
30 });
31
32 function goTo(idx) {
33 idx = ((idx % total) + total) % total;
34 current = idx;
35
36 slides.forEach(function (s, i) {
37 s.classList.toggle('is-active', i === current);
38 });
39 thumbBtns.forEach(function (t, i) {
40 t.classList.toggle('is-active', i === current);
41 });
42
43 if (counter) {
44 counter.textContent = current + 1 + ' / ' + total;
45 }
46
47 var capText = captions[current] || '';
48 if (caption) {
49 caption.textContent = capText;
50 }
51 if (belowCap) {
52 belowCap.textContent = capText;
53 }
54
55 if (lbEl && lbEl._updateLbImg) {
56 lbEl._updateLbImg();
57 }
58 }
59
60 thumbBtns.forEach(function (btn, i) {
61 btn.addEventListener('click', function () {
62 goTo(i);
63 });
64 });
65
66 if (prevBtn) {
67 prevBtn.addEventListener('click', function () {
68 goTo(current - 1);
69 });
70 }
71 if (nextBtn) {
72 nextBtn.addEventListener('click', function () {
73 goTo(current + 1);
74 });
75 }
76
77 var lbEl = null;
78 function openLightbox() {
79 if (lbEl) {
80 return;
81 }
82 lbEl = document.createElement('div');
83 lbEl.className = 'bkbg-gs-lightbox';
84
85 var img = document.createElement('img');
86 var srcImg = slides[current] && slides[current].querySelector('img');
87 img.src = srcImg ? srcImg.src : '';
88 img.alt = captions[current] || '';
89
90 var closeBtn = document.createElement('button');
91 closeBtn.type = 'button';
92 closeBtn.className = 'bkbg-gs-lightbox-close';
93 closeBtn.setAttribute('aria-label', 'Close');
94 closeBtn.textContent = '×';
95 closeBtn.addEventListener('click', closeLightbox);
96
97 var prevLb = document.createElement('button');
98 prevLb.type = 'button';
99 prevLb.className = 'bkbg-gs-arrow bkbg-gs-arrow--prev bkbg-gs-arrow--circle';
100 prevLb.textContent = '‹';
101 prevLb.addEventListener('click', function (e) {
102 e.stopPropagation();
103 goTo(current - 1);
104 });
105
106 var nextLb = document.createElement('button');
107 nextLb.type = 'button';
108 nextLb.className = 'bkbg-gs-arrow bkbg-gs-arrow--next bkbg-gs-arrow--circle';
109 nextLb.textContent = '›';
110 nextLb.addEventListener('click', function (e) {
111 e.stopPropagation();
112 goTo(current + 1);
113 });
114
115 function updateLbImg() {
116 var s = slides[current] && slides[current].querySelector('img');
117 img.src = s ? s.src : '';
118 img.alt = captions[current] || '';
119 }
120 lbEl._updateLbImg = updateLbImg;
121
122 lbEl.appendChild(img);
123 lbEl.appendChild(closeBtn);
124 lbEl.appendChild(prevLb);
125 lbEl.appendChild(nextLb);
126 lbEl.addEventListener('click', function (e) {
127 if (e.target === lbEl) {
128 closeLightbox();
129 }
130 });
131 document.body.appendChild(lbEl);
132 document.body.style.overflow = 'hidden';
133 }
134
135 function closeLightbox() {
136 if (lbEl) {
137 lbEl.remove();
138 lbEl = null;
139 document.body.style.overflow = '';
140 }
141 }
142
143 if (enableLb && lbTrigger) {
144 lbTrigger.addEventListener('click', openLightbox);
145 }
146
147 if (enableKbd) {
148 document.addEventListener('keydown', function (e) {
149 if (!wrap.isConnected) {
150 return;
151 }
152 if (e.key === 'ArrowLeft') {
153 goTo(current - 1);
154 }
155 if (e.key === 'ArrowRight') {
156 goTo(current + 1);
157 }
158 if (e.key === 'Escape' && enableLb) {
159 closeLightbox();
160 }
161 });
162 }
163
164 var touchStartX = 0;
165 mainEl.addEventListener('touchstart', function (e) {
166 touchStartX = e.touches[0].clientX;
167 }, { passive: true });
168 mainEl.addEventListener('touchend', function (e) {
169 var dx = e.changedTouches[0].clientX - touchStartX;
170 if (Math.abs(dx) > 40) {
171 goTo(dx < 0 ? current + 1 : current - 1);
172 }
173 }, { passive: true });
174
175 goTo(0);
176 });
177 })();
178