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 / spotlight-reveal / frontend.js

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

169 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 wp.domReady(function () {
2 var _typoKeys = [['family','font-family'],['weight','font-weight'],['style','font-style'],['decoration','text-decoration'],['transform','text-transform']];
3 var _sizeKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
4 var _lhKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
5 var _lsKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
6 var _wsKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
7
8 function typoCssVarsForEl(el, obj, prefix) {
9 if (!obj || typeof obj !== 'object') return;
10 _typoKeys.forEach(function (p) { if (obj[p[0]]) el.style.setProperty(prefix + '-' + p[1], obj[p[0]]); });
11 var u = obj.sizeUnit || 'px';
12 _sizeKeys.forEach(function (p) { var v = obj['size' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-font-size-' + p[1], v + u); });
13 _lhKeys.forEach(function (p) { var v = obj['lineHeight' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-line-height-' + p[1], String(v)); });
14 _lsKeys.forEach(function (p) { var v = obj['letterSpacing' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-letter-spacing-' + p[1], v + 'px'); });
15 _wsKeys.forEach(function (p) { var v = obj['wordSpacing' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-word-spacing-' + p[1], v + 'px'); });
16 }
17
18 document.querySelectorAll('.bkbg-spotlight-reveal-app').forEach(function (app) {
19 var opts = {};
20 try { opts = JSON.parse(app.getAttribute('data-opts') || '{}'); } catch (e) {}
21
22 var spotSize = opts.spotlightSize || 350;
23 var spotSoft = opts.spotlightSoft !== undefined ? opts.spotlightSoft : 80;
24 var overlayHex = opts.overlayColor || '#000000';
25 var overlayOp = (opts.overlayOpacity !== undefined ? opts.overlayOpacity : 85) / 100;
26 var revealColor = opts.revealColor || '#7c3aed';
27 var mode = opts.triggerMode || 'cursor';
28 var bgImage = opts.bgImageUrl || '';
29
30 /* Build RGBA from overlayColor */
31 function hexToRgba(hex, alpha) {
32 hex = hex.replace('#', '');
33 if (hex.length === 3) { hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]; }
34 var r = parseInt(hex.substr(0,2),16);
35 var g = parseInt(hex.substr(2,2),16);
36 var b = parseInt(hex.substr(4,2),16);
37 return 'rgba('+r+','+g+','+b+','+alpha+')';
38 }
39
40 var solidOverlay = hexToRgba(overlayHex, overlayOp);
41
42 /* Wrapper */
43 var wrap = document.createElement('div');
44 wrap.className = 'bkbg-sr-wrap';
45 wrap.style.paddingTop = (opts.paddingTop || 120) + 'px';
46 wrap.style.paddingBottom = (opts.paddingBottom || 120) + 'px';
47
48 /* Legacy + typo CSS vars */
49 wrap.style.setProperty('--bksr-hd-sz', (opts.headingSize || 48) + 'px');
50 wrap.style.setProperty('--bksr-hd-w', String(opts.headingFontWeight || '700'));
51 wrap.style.setProperty('--bksr-hd-lh', String(opts.headingLineHeight || 1.2));
52 wrap.style.setProperty('--bksr-tx-sz', (opts.textSize || 18) + 'px');
53 wrap.style.setProperty('--bksr-tx-lh', String(opts.textLineHeight || 1.6));
54 wrap.style.setProperty('--bksr-ey-sz', (opts.eyebrowSize || 13) + 'px');
55 typoCssVarsForEl(wrap, opts.headingTypo, '--bksr-hd');
56 typoCssVarsForEl(wrap, opts.textTypo, '--bksr-tx');
57 typoCssVarsForEl(wrap, opts.eyebrowTypo, '--bksr-ey');
58 typoCssVarsForEl(wrap, opts.ctaTypo, '--bksr-ct');
59
60 if (bgImage) {
61 wrap.style.background = 'url(' + bgImage + ') center/cover no-repeat';
62 } else {
63 wrap.style.background = revealColor;
64 }
65
66 /* Overlay */
67 var overlay = document.createElement('div');
68 overlay.className = 'bkbg-sr-overlay';
69 overlay.style.background = solidOverlay;
70
71 /* Content */
72 var inner = document.createElement('div');
73 inner.className = 'bkbg-sr-inner';
74 inner.style.maxWidth = (opts.maxWidth || 800) + 'px';
75 inner.style.textAlign = 'center';
76
77 if (opts.showEyebrow && opts.eyebrow) {
78 var eyeEl = document.createElement('span');
79 eyeEl.className = 'bkbg-sr-eyebrow';
80 eyeEl.style.color = opts.eyebrowColor || '#a78bfa';
81 eyeEl.innerHTML = opts.eyebrow;
82 inner.appendChild(eyeEl);
83 inner.appendChild(document.createElement('br'));
84 }
85
86 var h = document.createElement('h2');
87 h.className = 'bkbg-sr-heading';
88 h.style.color = opts.headingColor || '#ffffff';
89 h.innerHTML = opts.heading || '';
90 inner.appendChild(h);
91
92 var p = document.createElement('p');
93 p.className = 'bkbg-sr-text';
94 p.style.color = opts.subtextColor || '#e5e7eb';
95 p.innerHTML = opts.subtext || '';
96 inner.appendChild(p);
97
98 if (opts.showCta && opts.ctaLabel) {
99 var btn = document.createElement('a');
100 btn.className = 'bkbg-sr-btn';
101 btn.href = opts.ctaUrl || '#';
102 btn.style.background = opts.ctaBg || '#7c3aed';
103 btn.style.color = opts.ctaColor || '#ffffff';
104 btn.textContent = opts.ctaLabel;
105 inner.appendChild(btn);
106 }
107
108 wrap.appendChild(overlay);
109 wrap.appendChild(inner);
110 app.parentNode.replaceChild(wrap, app);
111
112 /* Build spotlight gradient */
113 function spotlightGradient(xPx, yPx) {
114 var innerRadius = spotSize * (1 - spotSoft / 100);
115 return 'radial-gradient(circle ' + spotSize + 'px at ' + xPx + 'px ' + yPx + 'px, transparent ' + innerRadius + 'px, ' + solidOverlay + ' ' + spotSize + 'px)';
116 }
117
118 if (mode === 'cursor') {
119 /* Initial state: fully dark */
120 overlay.style.background = solidOverlay;
121
122 wrap.addEventListener('mousemove', function (e) {
123 var rect = wrap.getBoundingClientRect();
124 var x = e.clientX - rect.left;
125 var y = e.clientY - rect.top;
126 overlay.style.background = spotlightGradient(x, y);
127 });
128
129 wrap.addEventListener('mouseleave', function () {
130 overlay.style.transition = 'background 0.6s ease';
131 overlay.style.background = solidOverlay;
132 setTimeout(function () { overlay.style.transition = ''; }, 650);
133 });
134
135 wrap.addEventListener('mouseenter', function () {
136 overlay.style.transition = '';
137 });
138 } else {
139 /* Scan mode: CSS animation sweeps spotlight across */
140 var scanX = 0;
141 var scanDir = 1;
142 var animFrame;
143
144 function scanStep() {
145 scanX += scanDir * 1.5;
146 var wrapW = wrap.offsetWidth;
147 if (scanX > wrapW + spotSize) { scanDir = -1; }
148 if (scanX < -spotSize) { scanDir = 1; }
149 var scanY = wrap.offsetHeight / 2;
150 overlay.style.background = spotlightGradient(scanX, scanY);
151 animFrame = requestAnimationFrame(scanStep);
152 }
153 scanStep();
154
155 /* Pause on hover, follow cursor */
156 wrap.addEventListener('mouseenter', function () {
157 cancelAnimationFrame(animFrame);
158 });
159 wrap.addEventListener('mousemove', function (e) {
160 var rect = wrap.getBoundingClientRect();
161 overlay.style.background = spotlightGradient(e.clientX - rect.left, e.clientY - rect.top);
162 });
163 wrap.addEventListener('mouseleave', function () {
164 scanStep();
165 });
166 }
167 });
168 });
169