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 / image-accordion / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.7, at blocks/image-accordion/frontend.js

101 lines 3.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 function parseColor(hex, opacity) {
5 if (!hex) return 'rgba(0,0,0,' + (opacity / 100) + ')';
6 var r = parseInt(hex.slice(1, 3), 16);
7 var g = parseInt(hex.slice(3, 5), 16);
8 var b = parseInt(hex.slice(5, 7), 16);
9 return 'rgba(' + r + ',' + g + ',' + b + ',' + (opacity / 100) + ')';
10 }
11
12 function reducedMotion() {
13 return window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
14 }
15
16 function initAccordion(container) {
17 var panels = Array.prototype.slice.call(container.querySelectorAll('.bkia-panel'));
18 var trigger = container.dataset.trigger || 'hover';
19 var defaultOpen = parseInt(container.dataset.default, 10) || 0;
20 var expFlex = parseFloat(container.dataset.expFlex) || 4;
21 var colFlex = parseFloat(container.dataset.colFlex) || 1;
22 var duration = parseInt(container.dataset.duration, 10) || 500;
23 var easing = container.dataset.easing || 'ease';
24 var ovOpacity = parseFloat(container.dataset.overlay) || 40;
25 var ovHover = parseFloat(container.dataset.ovHover) || 20;
26 var ovColor = container.dataset.ovColor || '#000000';
27 var doScale = container.dataset.scale !== 'false';
28 var textVis = container.dataset.textVis || 'always';
29
30 // Apply CSS transition timing to panels
31 var dur = reducedMotion() ? '0ms' : duration + 'ms';
32 panels.forEach(function (panel) {
33 panel.style.transition = 'flex ' + dur + ' ' + easing;
34 });
35
36 function activate(index) {
37 panels.forEach(function (panel, i) {
38 var isActive = (i === index);
39 var img = panel.querySelector('.bkia-img');
40 var overlay = panel.querySelector('.bkia-overlay');
41 var textEl = panel.querySelector('.bkia-text');
42
43 panel.style.flex = isActive ? String(expFlex) : String(colFlex);
44
45 if (overlay) {
46 overlay.style.background = parseColor(ovColor, isActive ? ovHover : ovOpacity);
47 }
48
49 if (img && doScale) {
50 img.style.transition = 'transform ' + dur + ' ' + easing;
51 img.style.transform = isActive ? 'scale(1.05)' : 'scale(1)';
52 }
53
54 if (textEl) {
55 if (textVis === 'always') {
56 textEl.style.opacity = '1';
57 } else if (textVis === 'expanded') {
58 textEl.style.opacity = isActive ? '1' : '0';
59 } else if (textVis === 'collapsed') {
60 textEl.style.opacity = isActive ? '0' : '1';
61 }
62 }
63
64 if (isActive) {
65 panel.classList.add('bkia-active');
66 } else {
67 panel.classList.remove('bkia-active');
68 }
69 });
70 }
71
72 // Set initial state
73 activate(defaultOpen);
74
75 // Bind events
76 if (trigger === 'hover') {
77 panels.forEach(function (panel, i) {
78 panel.addEventListener('mouseenter', function () { activate(i); });
79 });
80 } else {
81 panels.forEach(function (panel, i) {
82 panel.addEventListener('click', function () { activate(i); });
83 });
84 }
85 }
86
87 function init() {
88 var containers = document.querySelectorAll('.bkia-container[data-trigger]');
89 containers.forEach(function (container) {
90 initAccordion(container);
91 });
92 }
93
94 if (document.readyState === 'loading') {
95 document.addEventListener('DOMContentLoaded', init);
96 } else {
97 init();
98 }
99
100 }());
101