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

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

258 lines 11.3 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 var PLATFORM_ICONS = {
25 github: '</>',
26 twitter: 'X',
27 instagram: 'IG',
28 youtube: '',
29 dribbble: '',
30 behance: '',
31 custom: '🔗',
32 };
33 var CONTACT_ICONS = { email: '', phone: '', address: '📍', website: '🌐' };
34
35 function initials(name) {
36 return (name || '??').split(' ').map(function (w) { return w[0] || ''; }).join('').slice(0, 2).toUpperCase();
37 }
38
39 function init() {
40 document.querySelectorAll('.bkbg-cc-app').forEach(function (appEl) {
41 if (appEl.dataset.rendered) return;
42 appEl.dataset.rendered = '1';
43 var opts;
44 try { opts = JSON.parse(appEl.dataset.opts || '{}'); } catch (e) { opts = {}; }
45 var o = Object.assign({
46 name: 'Sarah Johnson',
47 jobTitle: 'Lead Designer',
48 company: 'Acme Studio',
49 email: 'sarah@acme.studio',
50 phone: '+1 (555) 234-5678',
51 address: '',
52 website: 'https://acme.studio',
53 photoUrl: '',
54 photoId: 0,
55 showPhoto: true,
56 links: [],
57 showLinks: true,
58 style: 'card',
59 cardOrientation: 'vertical',
60 maxWidth: 380,
61 align: 'center',
62 avatarSize: 88,
63 borderRadius: 16,
64 cardPadding: 28,
65 showShadow: true,
66 showDivider: true,
67 cardBg: '#ffffff',
68 cardBorder: '#e5e7eb',
69 nameColor: '#111827',
70 titleColor: '#6b7280',
71 companyColor: '#374151',
72 iconBg: '#f1f5f9',
73 iconColor: '#374151',
74 linkColor: '#6366f1',
75 dividerColor: '#f1f5f9',
76 accentBg: '#6366f1',
77 metaSize: 14,
78 nameSize: 20,
79 }, opts);
80
81 var isBadge = o.style === 'badge';
82 var isHoriz = o.cardOrientation === 'horizontal';
83
84 // ── Outer ──
85 var outer = document.createElement('div');
86 outer.className = 'bkbg-cc-outer align-' + o.align;
87
88 // ── Card ──
89 var card = document.createElement('div');
90 card.className = 'bkbg-cc-card style-' + o.style + (o.showShadow && o.style === 'card' ? ' has-shadow' : '');
91 card.style.maxWidth = o.maxWidth + 'px';
92 card.style.borderRadius = o.borderRadius + 'px';
93 card.style.background = o.cardBg;
94 card.style.overflow = 'hidden';
95 card.style.setProperty('--bkbg-cc-border', o.cardBorder);
96 card.style.setProperty('--bkbg-cc-accent', o.accentBg);
97 card.style.setProperty('--bkbg-cc-icon-bg', o.iconBg);
98 card.style.setProperty('--bkbg-cc-icon-color', o.iconColor);
99 card.style.setProperty('--bkbg-cc-link', o.linkColor);
100 card.style.setProperty('--bkbg-cc-divider', o.dividerColor);
101
102 // Badge header
103 if (isBadge) {
104 var badgeHeader = document.createElement('div');
105 badgeHeader.className = 'bkbg-cc-badge-header';
106 badgeHeader.style.background = o.accentBg;
107 card.appendChild(badgeHeader);
108 }
109
110 // ── Body ──
111 var body = document.createElement('div');
112 body.className = 'bkbg-cc-body orient-' + o.cardOrientation + ' text-' + o.align;
113 body.style.padding = o.cardPadding + 'px';
114 body.style.flexDirection = isHoriz ? 'row' : 'column';
115 body.style.alignItems = isHoriz ? 'center' : (o.align === 'center' ? 'center' : o.align === 'right' ? 'flex-end' : 'flex-start');
116 if (isBadge && !isHoriz) {
117 body.style.marginTop = -(o.avatarSize / 2) + 'px';
118 }
119
120 // ── Avatar ──
121 var avatarEl = null;
122 if (o.showPhoto) {
123 if (o.photoUrl) {
124 avatarEl = document.createElement('img');
125 avatarEl.className = 'bkbg-cc-avatar';
126 avatarEl.src = o.photoUrl;
127 avatarEl.alt = o.name || '';
128 avatarEl.width = o.avatarSize;
129 avatarEl.height = o.avatarSize;
130 avatarEl.style.width = o.avatarSize + 'px';
131 avatarEl.style.height = o.avatarSize + 'px';
132 avatarEl.style.border = '3px solid ' + (isBadge ? '#fff' : o.cardBg);
133 } else {
134 avatarEl = document.createElement('div');
135 avatarEl.className = 'bkbg-cc-avatar-placeholder';
136 avatarEl.style.width = o.avatarSize + 'px';
137 avatarEl.style.height = o.avatarSize + 'px';
138 avatarEl.style.fontSize = Math.round(o.avatarSize * 0.38) + 'px';
139 avatarEl.style.background = o.accentBg;
140 avatarEl.style.border = '3px solid ' + (isBadge ? '#fff' : o.cardBg);
141 avatarEl.textContent = initials(o.name);
142 }
143 }
144
145 // ── Text block ──
146 var textEl = document.createElement('div');
147 textEl.style.flex = '1';
148
149 var nameEl = document.createElement('p');
150 nameEl.className = 'bkbg-cc-name';
151 nameEl.style.color = o.nameColor;
152 nameEl.textContent = o.name || '';
153 textEl.appendChild(nameEl);
154
155 if (o.jobTitle || o.company) {
156 var metaEl = document.createElement('p');
157 metaEl.className = 'bkbg-cc-meta';
158 metaEl.style.color = o.titleColor;
159 metaEl.textContent = [o.jobTitle, o.company].filter(Boolean).join(' · ');
160 textEl.appendChild(metaEl);
161 }
162
163 // Divider
164 if (o.showDivider) {
165 var divEl = document.createElement('hr');
166 divEl.className = 'bkbg-cc-divider';
167 divEl.style.background = o.dividerColor;
168 textEl.appendChild(divEl);
169 }
170
171 // Contact details
172 var contactDetails = [
173 { field: 'email', href: 'mailto:' + o.email },
174 { field: 'phone', href: 'tel:' + o.phone.replace(/\s/g, '') },
175 { field: 'address', href: null },
176 { field: 'website', href: o.website },
177 ];
178
179 var hasContact = contactDetails.some(function (c) { return !!o[c.field]; });
180 if (hasContact) {
181 var contacts = document.createElement('div');
182 contacts.className = 'bkbg-cc-contacts';
183 contacts.style.color = o.companyColor;
184
185 contactDetails.forEach(function (c) {
186 if (!o[c.field]) return;
187 var row = document.createElement('div');
188 row.className = 'bkbg-cc-contact-row';
189
190 var icon = document.createElement('span');
191 icon.className = 'bkbg-cc-contact-icon';
192 icon.textContent = CONTACT_ICONS[c.field] || '';
193 row.appendChild(icon);
194
195 var valueEl;
196 if (c.href) {
197 valueEl = document.createElement('a');
198 valueEl.className = 'bkbg-cc-contact-link bkbg-cc-contact-value';
199 valueEl.href = c.href;
200 if (c.field === 'website') { valueEl.target = '_blank'; valueEl.rel = 'noopener noreferrer'; }
201 valueEl.textContent = o[c.field];
202 } else {
203 valueEl = document.createElement('span');
204 valueEl.className = 'bkbg-cc-contact-value';
205 valueEl.textContent = o[c.field];
206 }
207 row.appendChild(valueEl);
208 contacts.appendChild(row);
209 });
210 textEl.appendChild(contacts);
211 }
212
213 // Social links
214 if (o.showLinks && o.links && o.links.length > 0) {
215 var linksRow = document.createElement('div');
216 linksRow.className = 'bkbg-cc-links links-' + o.align;
217
218 o.links.forEach(function (lnk) {
219 var a = document.createElement('a');
220 a.className = 'bkbg-cc-link-btn';
221 a.href = lnk.url || '#';
222 a.target = '_blank';
223 a.rel = 'noopener noreferrer';
224 a.setAttribute('aria-label', lnk.label || lnk.platform);
225 a.title = lnk.label || lnk.platform;
226 a.textContent = PLATFORM_ICONS[lnk.platform] || '🔗';
227 linksRow.appendChild(a);
228 });
229 textEl.appendChild(linksRow);
230 }
231
232 // ── Assemble ──
233 if (isBadge) {
234 var badgeInner = document.createElement('div');
235 badgeInner.className = 'bkbg-cc-badge-inner align-' + o.align;
236 if (avatarEl) badgeInner.appendChild(avatarEl);
237 badgeInner.appendChild(textEl);
238 body.appendChild(badgeInner);
239 } else {
240 if (avatarEl) body.appendChild(avatarEl);
241 body.appendChild(textEl);
242 }
243
244 card.appendChild(body);
245 outer.appendChild(card);
246
247 typoCssVarsForEl(o.typoName, '--bkcc-name-', outer);
248 typoCssVarsForEl(o.typoMeta, '--bkcc-meta-', outer);
249
250 appEl.parentNode.insertBefore(outer, appEl);
251 appEl.style.display = 'none';
252 });
253 }
254
255 if (document.readyState !== 'loading') { init(); }
256 else { document.addEventListener('DOMContentLoaded', init); }
257 })();
258