PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.13
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.13
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 / creative-button / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.13, at blocks/creative-button/frontend.js

156 lines 7.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 function typoCssVarsForEl(typo, prefix, el) {
2 if (!typo || typeof typo !== 'object') return;
3 var map = {
4 family: 'font-family', weight: 'font-weight', style: 'font-style',
5 transform: 'text-transform', decoration: 'text-decoration',
6 sizeDesktop: 'font-size-d', sizeTablet: 'font-size-t', sizeMobile: 'font-size-m',
7 sizeUnit: null,
8 lineHeightDesktop: 'line-height-d', lineHeightTablet: 'line-height-t', lineHeightMobile: 'line-height-m',
9 lineHeightUnit: null,
10 letterSpacingDesktop: 'letter-spacing-d', letterSpacingTablet: 'letter-spacing-t', letterSpacingMobile: 'letter-spacing-m',
11 letterSpacingUnit: null,
12 wordSpacingDesktop: 'word-spacing-d', wordSpacingTablet: 'word-spacing-t', wordSpacingMobile: 'word-spacing-m',
13 wordSpacingUnit: null
14 };
15 var sizeU = typo.sizeUnit || 'px';
16 var lhU = typo.lineHeightUnit || '';
17 var lsU = typo.letterSpacingUnit || 'px';
18 var wsU = typo.wordSpacingUnit || 'px';
19 Object.keys(map).forEach(function (k) {
20 var css = map[k]; if (!css) return;
21 var v = typo[k]; if (v === undefined || v === '' || v === null) return;
22 if (/size|spacing/i.test(k)) {
23 var u = /letterSpacing/.test(k) ? lsU : /wordSpacing/.test(k) ? wsU : /lineHeight/.test(k) ? lhU : sizeU;
24 v = v + u;
25 }
26 el.style.setProperty(prefix + css, v);
27 });
28 }
29
30 wp.domReady(function () {
31 document.querySelectorAll('.bkbg-creative-button-app').forEach(function (app) {
32 var opts = {};
33 try { opts = JSON.parse(app.getAttribute('data-opts') || '{}'); } catch (e) {}
34
35 var label = opts.label || 'Get Started';
36 var url = opts.url || '#';
37 var openNewTab = opts.openNewTab === true;
38 var effect = opts.hoverEffect || 'slide';
39 var btnStyle = opts.buttonStyle || 'filled';
40 var corners = opts.corners || 'rounded';
41 var bgColor = opts.bgColor || '#7c3aed';
42 var textColor = opts.textColor || '#ffffff';
43 var hoverBg = opts.hoverBg || '#4f46e5';
44 var hoverColor = opts.hoverColor || '#ffffff';
45 var borderCol = opts.borderColor || '#7c3aed';
46 var borderWidth = opts.borderWidth !== undefined ? opts.borderWidth : 2;
47 var gFrom = opts.gradientFrom || '#7c3aed';
48 var gTo = opts.gradientTo || '#2563eb';
49 var fontSize = opts.fontSize || 16;
50 var paddingH = opts.paddingH || 32;
51 var paddingV = opts.paddingV || 14;
52 var iconSize = opts.iconSize || 16;
53 var showIcon = opts.showIcon !== false;
54 var icon = opts.icon || '';
55 var iconType = opts.iconType || 'custom-char';
56 var iconDash = opts.iconDashicon || '';
57 var iconImg = opts.iconImageUrl || '';
58 var iconPos = opts.iconPosition || 'right';
59 var centered = opts.centered !== false;
60 var fullWidth = opts.fullWidth === true;
61
62 var radius = corners === 'pill' ? '999px' : corners === 'rounded' ? '8px' : '0';
63
64 /* Wrapper */
65 var wrap = document.createElement('div');
66 wrap.className = 'bkbg-cb2-wrap';
67 wrap.style.textAlign = centered ? 'center' : 'left';
68 wrap.style.padding = '4px 0';
69
70 /* Button */
71 var btn = document.createElement('a');
72 btn.className = 'bkbg-cb2-btn bkbg-cb2-btn--' + effect + (fullWidth ? ' bkbg-cb2-full-width' : '');
73 btn.href = url;
74 if (openNewTab) { btn.target = '_blank'; btn.rel = 'noopener noreferrer'; }
75
76 /* Apply CSS custom props for hover effects */
77 btn.style.setProperty('--bkbg-cb2-hover-bg', hoverBg);
78 btn.style.setProperty('--bkbg-cb2-hover-color', hoverColor);
79 btn.style.setProperty('--bkbg-cb2-ph', paddingH + 'px');
80 btn.style.padding = paddingV + 'px ' + paddingH + 'px';
81 btn.style.borderRadius = radius;
82 btn.style.border = borderWidth + 'px solid ' + borderCol;
83
84 /* Background / color based on button style */
85 if (btnStyle === 'outline') {
86 btn.style.background = 'transparent';
87 btn.style.color = bgColor;
88 } else if (btnStyle === 'ghost') {
89 btn.style.background = 'transparent';
90 btn.style.color = bgColor;
91 btn.style.border = 'none';
92 } else if (btnStyle === 'gradient') {
93 btn.style.background = 'linear-gradient(to right, ' + gFrom + ', ' + gTo + ')';
94 btn.style.color = textColor;
95 btn.style.border = 'none';
96 } else {
97 btn.style.background = bgColor;
98 btn.style.color = textColor;
99 }
100
101 /* Icon left */
102 if (showIcon && iconPos === 'left') {
103 var iLeft = document.createElement('span');
104 iLeft.className = 'bkbg-cb2-icon';
105 iLeft.style.fontSize = iconSize + 'px';
106 if (iconType !== 'custom-char' && window.bkbgIconPicker) {
107 iLeft.appendChild(window.bkbgIconPicker.buildFrontendIcon(iconType, icon, iconDash, iconImg, iconDashColor));
108 } else {
109 iLeft.textContent = icon;
110 }
111 btn.appendChild(iLeft);
112 }
113
114 /* Label */
115 var lbl = document.createElement('span');
116 lbl.className = 'bkbg-cb2-label';
117 lbl.innerHTML = label;
118 btn.appendChild(lbl);
119
120 /* Icon right / arrow effect */
121 if (showIcon && iconPos === 'right') {
122 var iRight = document.createElement('span');
123 iRight.className = 'bkbg-cb2-icon' + (effect === 'arrow' ? ' bkbg-cb2-arrow-icon' : '');
124 iRight.style.fontSize = iconSize + 'px';
125 if (iconType !== 'custom-char' && window.bkbgIconPicker) {
126 iRight.appendChild(window.bkbgIconPicker.buildFrontendIcon(iconType, icon, iconDash, iconImg, iconDashColor));
127 } else {
128 iRight.textContent = icon;
129 }
130 btn.appendChild(iRight);
131 }
132
133 /* Ripple effect - click handler */
134 if (effect === 'ripple') {
135 btn.addEventListener('click', function (e) {
136 var rect = btn.getBoundingClientRect();
137 var size = Math.max(btn.offsetWidth, btn.offsetHeight) * 2;
138 var x = e.clientX - rect.left - size / 2;
139 var y = e.clientY - rect.top - size / 2;
140 var circle = document.createElement('span');
141 circle.className = 'bkbg-cb2-ripple-circle';
142 circle.style.width = size + 'px';
143 circle.style.height = size + 'px';
144 circle.style.left = x + 'px';
145 circle.style.top = y + 'px';
146 btn.appendChild(circle);
147 setTimeout(function () { if (circle.parentNode) circle.parentNode.removeChild(circle); }, 600);
148 });
149 }
150
151 wrap.appendChild(btn);
152 typoCssVarsForEl(opts.typoBtn, '--bkbg-cb2-btn-', wrap);
153 app.parentNode.replaceChild(wrap, app);
154 });
155 });
156