PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.7
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.7
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.7, at blocks/gallery-showcase/frontend.js

154 lines 6.8 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) return;
7
8 var slides = [].slice.call(wrap.querySelectorAll('.bkbg-gs-slide'));
9 var thumbBtns = [].slice.call(wrap.querySelectorAll('.bkbg-gs-thumb'));
10 var prevBtn = wrap.querySelector('.bkbg-gs-arrow--prev');
11 var nextBtn = wrap.querySelector('.bkbg-gs-arrow--next');
12 var counter = wrap.querySelector('.bkbg-gs-counter');
13 var caption = wrap.querySelector('.bkbg-gs-caption');
14 var belowCap = wrap.querySelector('.bkbg-gs-below-caption');
15 var lbTrigger = wrap.querySelector('.bkbg-gs-lightbox-trigger');
16 var enableLb = wrap.getAttribute('data-lightbox') === '1';
17 var enableKbd = wrap.getAttribute('data-keyboard') === '1';
18 var transition= mainEl.getAttribute('data-transition') || 'fade';
19 var duration = parseInt(mainEl.getAttribute('data-duration') || '320', 10);
20
21 var current = 0;
22 var total = slides.length;
23 if (!total) return;
24
25 /* Caption data: pull from slide img alt or dedicated attribute if present */
26 var captions = slides.map(function (s) {
27 var img = s.querySelector('img');
28 return (img && img.getAttribute('data-caption')) || (img && img.alt) || '';
29 });
30
31 function goTo(idx, animate) {
32 idx = ((idx % total) + total) % total;
33 if (idx === current && animate !== false) return;
34
35 var prev = slides[current];
36 var next = slides[idx];
37 current = idx;
38
39 if (transition === 'slide' && animate !== false) {
40 var dir = idx > (current < idx ? current : idx) ? 1 : -1;
41 prev.style.transition = 'none';
42 next.style.transition = 'none';
43 next.style.display = '';
44 next.style.position = 'absolute';
45 next.style.top = '0'; next.style.left = '0'; next.style.width = '100%';
46 next.style.transform = 'translateX(' + (100) + '%)';
47 requestAnimationFrame(function () {
48 prev.style.transition = 'transform ' + duration + 'ms ease';
49 next.style.transition = 'transform ' + duration + 'ms ease';
50 prev.style.transform = 'translateX(-100%)';
51 next.style.transform = 'translateX(0)';
52 setTimeout(function () {
53 prev.style.display = 'none';
54 prev.style.transform = '';
55 prev.style.position = '';
56 next.style.position = '';
57 slides.forEach(function (s, i) { s.classList.toggle('is-active', i === current); });
58 }, duration);
59 });
60 } else {
61 slides.forEach(function (s, i) {
62 s.style.display = i === idx ? '' : 'none';
63 s.classList.toggle('is-active', i === idx);
64 });
65 }
66
67 /* Thumbs */
68 thumbBtns.forEach(function (t, i) { t.classList.toggle('is-active', i === current); });
69
70 /* Counter */
71 if (counter) counter.textContent = (current + 1) + ' / ' + total;
72
73 /* Caption */
74 var capText = captions[current] || '';
75 if (caption) caption.textContent = capText;
76 if (belowCap) belowCap.textContent = capText;
77 }
78
79 /* Thumb clicks */
80 thumbBtns.forEach(function (btn, i) {
81 btn.addEventListener('click', function () { goTo(i); });
82 });
83
84 /* Arrows */
85 if (prevBtn) prevBtn.addEventListener('click', function () { goTo(current - 1); });
86 if (nextBtn) nextBtn.addEventListener('click', function () { goTo(current + 1); });
87
88 /* Keyboard */
89 if (enableKbd) {
90 document.addEventListener('keydown', function (e) {
91 /* Only react when no lightbox is open, or when lightbox is open */
92 if (e.key === 'ArrowLeft') goTo(current - 1);
93 if (e.key === 'ArrowRight') goTo(current + 1);
94 if (e.key === 'Escape' && enableLb) closeLightbox();
95 });
96 }
97
98 /* Lightbox */
99 var lbEl = null;
100 function openLightbox() {
101 if (lbEl) return;
102 lbEl = document.createElement('div');
103 lbEl.className = 'bkbg-gs-lightbox';
104 var img = document.createElement('img');
105 var src = (slides[current] && slides[current].querySelector('img') && slides[current].querySelector('img').src) || '';
106 img.src = src;
107 img.alt = captions[current] || '';
108 var closeBtn = document.createElement('button');
109 closeBtn.className = 'bkbg-gs-lightbox-close';
110 closeBtn.textContent = '×';
111 closeBtn.addEventListener('click', closeLightbox);
112 var prevLb = document.createElement('button');
113 prevLb.className = 'bkbg-gs-arrow bkbg-gs-arrow--prev bkbg-gs-arrow--circle';
114 prevLb.textContent = '';
115 prevLb.addEventListener('click', function () { goTo(current - 1); updateLbImg(); });
116 var nextLb = document.createElement('button');
117 nextLb.className = 'bkbg-gs-arrow bkbg-gs-arrow--next bkbg-gs-arrow--circle';
118 nextLb.textContent = '';
119 nextLb.addEventListener('click', function () { goTo(current + 1); updateLbImg(); });
120 lbEl.appendChild(img);
121 lbEl.appendChild(closeBtn);
122 lbEl.appendChild(prevLb);
123 lbEl.appendChild(nextLb);
124 lbEl.addEventListener('click', function (e) { if (e.target === lbEl) closeLightbox(); });
125 document.body.appendChild(lbEl);
126 document.body.style.overflow = 'hidden';
127
128 function updateLbImg() {
129 var s = slides[current] && slides[current].querySelector('img');
130 img.src = s ? s.src : '';
131 img.alt = captions[current] || '';
132 }
133 lbEl._updateLbImg = updateLbImg;
134 }
135 function closeLightbox() {
136 if (lbEl) { lbEl.remove(); lbEl = null; document.body.style.overflow = ''; }
137 }
138 if (enableLb && lbTrigger) {
139 lbTrigger.addEventListener('click', openLightbox);
140 }
141
142 /* Swipe support */
143 var touchStartX = 0;
144 mainEl.addEventListener('touchstart', function (e) { touchStartX = e.touches[0].clientX; }, { passive: true });
145 mainEl.addEventListener('touchend', function (e) {
146 var dx = e.changedTouches[0].clientX - touchStartX;
147 if (Math.abs(dx) > 40) goTo(dx < 0 ? current + 1 : current - 1);
148 }, { passive: true });
149
150 /* Init */
151 goTo(0, false);
152 });
153 })();
154