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 / gradient-border-card / frontend.js

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

166 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 function typoCssVarsForEl(typo, prefix, el) {
3 if (!typo || typeof typo !== 'object') return;
4 var map = {
5 family:'font-family', weight:'font-weight', style:'font-style',
6 decoration:'text-decoration', transform:'text-transform',
7 sizeDesktop:'font-size-d', sizeTablet:'font-size-t', sizeMobile:'font-size-m',
8 lineHeightDesktop:'line-height-d', lineHeightTablet:'line-height-t', lineHeightMobile:'line-height-m',
9 letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
10 wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m'
11 };
12 Object.keys(map).forEach(function(k) {
13 if (typo[k] !== undefined && typo[k] !== '') {
14 var v = typo[k];
15 if (['sizeDesktop','sizeTablet','sizeMobile'].indexOf(k) !== -1) v = v + (typo.sizeUnit || 'px');
16 else if (['lineHeightDesktop','lineHeightTablet','lineHeightMobile'].indexOf(k) !== -1) v = v + (typo.lineHeightUnit || '');
17 else if (['letterSpacingDesktop','letterSpacingTablet','letterSpacingMobile'].indexOf(k) !== -1) v = v + (typo.letterSpacingUnit || 'px');
18 else if (['wordSpacingDesktop','wordSpacingTablet','wordSpacingMobile'].indexOf(k) !== -1) v = v + (typo.wordSpacingUnit || 'px');
19 el.style.setProperty(prefix + map[k], String(v));
20 }
21 });
22 }
23
24 function initGradientBorderCard(appEl) {
25 var opts;
26 try { opts = JSON.parse(appEl.getAttribute('data-opts') || '{}'); } catch(e) { opts = {}; }
27
28 var a = {
29 title: opts.title || 'Feature Card',
30 description: opts.description || '',
31 badge: opts.badge || '',
32 icon: opts.icon || '',
33 showIcon: opts.showIcon !== false,
34 showBadge: opts.showBadge || false,
35 titleTag: opts.titleTag || 'h3',
36 borderColors: opts.borderColors || ['#7c3aed','#ec4899','#06b6d4','#f59e0b'],
37 borderWidth: opts.borderWidth || 2,
38 borderRadius: opts.borderRadius || 20,
39 animSpeed: opts.animSpeed || 4,
40 animType: opts.animType || 'rotate',
41 glowBlur: opts.glowBlur === undefined ? 14 : opts.glowBlur,
42 glowOpacity: opts.glowOpacity === undefined ? 0.7 : opts.glowOpacity,
43 cardBg: opts.cardBg || '#0f172a',
44 textColor: opts.textColor || '#e2e8f0',
45 titleColor: opts.titleColor || '#ffffff',
46 iconColor: opts.iconColor || '#a78bfa',
47 badgeBg: opts.badgeBg || '#7c3aed',
48 badgeColor: opts.badgeColor || '#ffffff',
49 paddingV: opts.paddingV || 32,
50 paddingH: opts.paddingH || 28,
51 fontSize: opts.fontSize || 16,
52 titleSize: opts.titleSize || 22,
53 iconSize: opts.iconSize || 36,
54 maxWidth: opts.maxWidth || 420,
55 hoverScale: opts.hoverScale !== false,
56 pauseOnHover: opts.pauseOnHover || false,
57 textAlign: opts.textAlign || 'left'
58 };
59
60 var colors = a.borderColors;
61 var innerRadius = Math.max(0, a.borderRadius - a.borderWidth);
62
63 /* --- wrapper --- */
64 var wrap = document.createElement('div');
65 wrap.className = 'bkbg-gbc-wrap' + (a.hoverScale ? ' bkbg-gbc-hover-scale' : '') + (a.pauseOnHover ? ' bkbg-gbc-pause-hover' : '');
66
67 /* CSS variables on wrapper */
68 var cs = wrap.style;
69 var c0 = colors[0], c1 = colors[1]||c0, c2 = colors[2]||c0, c3 = colors[3]||c0;
70 cs.setProperty('--bkbg-gbc-c1', c0);
71 cs.setProperty('--bkbg-gbc-c2', c1);
72 cs.setProperty('--bkbg-gbc-c3', c2);
73 cs.setProperty('--bkbg-gbc-c4', c3);
74 cs.setProperty('--bkbg-gbc-speed', a.animSpeed + 's');
75 cs.setProperty('--bkbg-gbc-border-width', a.borderWidth + 'px');
76 cs.setProperty('--bkbg-gbc-radius', a.borderRadius + 'px');
77 cs.setProperty('--bkbg-gbc-inner-radius', innerRadius + 'px');
78 cs.setProperty('--bkbg-gbc-glow-blur', a.glowBlur + 'px');
79 cs.setProperty('--bkbg-gbc-glow-opacity', String(a.glowOpacity));
80 cs.setProperty('--bkbg-gbc-card-bg', a.cardBg);
81 cs.setProperty('--bkbg-gbc-text-color', a.textColor);
82 cs.setProperty('--bkbg-gbc-title-color', a.titleColor);
83 cs.setProperty('--bkbg-gbc-icon-color', a.iconColor);
84 cs.setProperty('--bkbg-gbc-badge-bg', a.badgeBg);
85 cs.setProperty('--bkbg-gbc-badge-color', a.badgeColor);
86 cs.setProperty('--bkbg-gbc-pad-v', a.paddingV + 'px');
87 cs.setProperty('--bkbg-gbc-pad-h', a.paddingH + 'px');
88 cs.setProperty('--bkbg-gbc-font-size', a.fontSize + 'px');
89 cs.setProperty('--bkbg-gbc-title-size', a.titleSize + 'px');
90 cs.setProperty('--bkbg-gbc-icon-size', a.iconSize + 'px');
91 cs.setProperty('--bkbg-gbc-text-align', a.textAlign);
92 cs.setProperty('--bkbg-gbc-max-width', a.maxWidth + 'px');
93
94 typoCssVarsForEl(opts.typoTitle, '--bkbg-gbc-tt-', wrap);
95 typoCssVarsForEl(opts.typoBody, '--bkbg-gbc-bd-', wrap);
96 typoCssVarsForEl(opts.typoBadge, '--bkbg-gbc-bg-', wrap);
97
98 /* For >4 colors: inject a custom keyframe / conic-gradient with all colors */
99 if (colors.length > 4 || (a.animType === 'rotate' && colors.length >= 2)) {
100 var conicStop = colors.concat([colors[0]]).join(', ');
101 var styleId = 'bkbg-gbc-style-' + Math.random().toString(36).slice(2);
102 var styleTag = document.createElement('style');
103 styleTag.id = styleId;
104 styleTag.textContent = [
105 '.bkbg-gbc-outer.bkbg-gbc-rotate::before {',
106 ' background: conic-gradient(' + conicStop + ') !important;',
107 '}',
108 '.bkbg-gbc-outer.bkbg-gbc-rotate::after {',
109 ' background: conic-gradient(' + conicStop + ') !important;',
110 '}'
111 ].join('\n');
112 document.head.appendChild(styleTag);
113 }
114
115 /* Outer */
116 var outer = document.createElement('div');
117 var animClass = {rotate:'bkbg-gbc-rotate', shift:'bkbg-gbc-shift', pulse:'bkbg-gbc-pulse', static:'bkbg-gbc-static'}[a.animType] || 'bkbg-gbc-rotate';
118 outer.className = 'bkbg-gbc-outer ' + animClass;
119
120 /* Inner */
121 var inner = document.createElement('div');
122 inner.className = 'bkbg-gbc-inner';
123
124 /* Badge */
125 if (a.showBadge && a.badge) {
126 var badgeEl = document.createElement('div');
127 badgeEl.className = 'bkbg-gbc-badge';
128 badgeEl.textContent = a.badge;
129 inner.appendChild(badgeEl);
130 }
131
132 /* Icon */
133 if (a.showIcon && a.icon) {
134 var iconEl = document.createElement('div');
135 iconEl.className = 'bkbg-gbc-icon';
136 var gbcIconType = opts.iconType || 'custom-char';
137 if (gbcIconType !== 'custom-char' && window.bkbgIconPicker) {
138 iconEl.appendChild(window.bkbgIconPicker.buildFrontendIcon(gbcIconType, a.icon, opts.iconDashicon, opts.iconImageUrl, opts.iconDashiconColor));
139 } else {
140 iconEl.textContent = a.icon;
141 }
142 inner.appendChild(iconEl);
143 }
144
145 /* Title */
146 var titleEl = document.createElement(a.titleTag);
147 titleEl.className = 'bkbg-gbc-title';
148 titleEl.textContent = a.title;
149 inner.appendChild(titleEl);
150
151 /* Description */
152 if (a.description) {
153 var descEl = document.createElement('p');
154 descEl.className = 'bkbg-gbc-desc';
155 descEl.textContent = a.description;
156 inner.appendChild(descEl);
157 }
158
159 outer.appendChild(inner);
160 wrap.appendChild(outer);
161 appEl.replaceWith(wrap);
162 }
163
164 document.querySelectorAll('.bkbg-gbc-app').forEach(initGradientBorderCard);
165 })();
166