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 / ebook-section / frontend.js

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

218 lines 11.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 var FORMAT_LABELS = { pdf: 'PDF', epub: 'EPUB', course: 'Course', template: 'Template', toolkit: 'Toolkit', guide: 'Guide', checklist: 'Checklist' };
3
4 function typoCssVarsForEl(typo, prefix, el) {
5 if (!typo || typeof typo !== 'object') return;
6 var m = { family:'font-family', weight:'font-weight', transform:'text-transform', style:'font-style', decoration:'text-decoration',
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 Object.keys(m).forEach(function (k) {
12 if (typo[k] !== undefined && typo[k] !== '') {
13 var v = typo[k], u = typo[k + 'Unit'] || '';
14 if (/Desktop|Tablet|Mobile/.test(k) && typeof v === 'number') v = v + (u || 'px');
15 el.style.setProperty(prefix + m[k], '' + v);
16 }
17 });
18 }
19
20 function init() {
21 document.querySelectorAll('.bkbg-ebk-app').forEach(function (el) {
22 if (el.dataset.rendered) return;
23 el.dataset.rendered = '1';
24 var opts;
25 try { opts = JSON.parse(el.dataset.opts || '{}'); } catch (e) { opts = {}; }
26 var o = Object.assign({
27 coverUrl: '', coverAlt: '',
28 title: 'The Complete SEO Handbook',
29 subtitle: 'Everything you need to rank #1 in Google.',
30 authorName: '',
31 format: 'pdf', formatLabel: '', pageCount: '',
32 whatInside: [],
33 showTestimonial: true,
34 testimonialQuote: '',
35 testimonialName: '',
36 ctaLabel: 'Download Free →', ctaUrl: '#',
37 price: 'Free', originalPrice: '',
38 openInNewTab: false,
39 layout: 'split', show3D: true,
40 bgColor: '#f0f4ff',
41 titleColor: '#111827', subtitleColor: '#374151', authorColor: '#6b7280',
42 formatBadgeBg: '#6366f1', formatBadgeColor: '#ffffff',
43 itemColor: '#374151',
44 testimonialBg: '#ffffff', testimonialColor: '#374151', quoteColor: '#6366f1',
45 ctaBg: '#6366f1', ctaColor: '#ffffff',
46 priceColor: '#16a34a', origPriceColor: '#9ca3af',
47 coverShadow: '#6366f160',
48 borderRadius: 12, paddingTop: 60, paddingBottom: 60
49 }, opts);
50
51 var target = o.openInNewTab ? '_blank' : '_self';
52 var fmtLabel = o.formatLabel || FORMAT_LABELS[o.format] || o.format.toUpperCase();
53
54 var section = document.createElement('div');
55 section.className = 'bkbg-ebk-section';
56 section.style.cssText = 'background:' + o.bgColor + ';padding:' + o.paddingTop + 'px 0 ' + o.paddingBottom + 'px;box-sizing:border-box;font-family:inherit;';
57
58 typoCssVarsForEl(o.typoTitle, '--bkbg-ebk-ttl-', section);
59 typoCssVarsForEl(o.typoSubtitle, '--bkbg-ebk-sub-', section);
60 typoCssVarsForEl(o.typoPrice, '--bkbg-ebk-prc-', section);
61 typoCssVarsForEl(o.typoCta, '--bkbg-ebk-cta-', section);
62
63 var inner = document.createElement('div');
64 inner.className = 'bkbg-ebk-inner';
65 inner.style.cssText = 'max-width:960px;margin:0 auto;padding:0 20px;';
66
67 var layout = document.createElement('div');
68 layout.className = 'bkbg-ebk-' + o.layout;
69
70 if (o.layout === 'split') {
71 layout.style.cssText = 'display:flex;gap:40px;align-items:center;flex-wrap:wrap;';
72 } else if (o.layout === 'centered') {
73 layout.style.cssText = 'display:flex;flex-direction:column;align-items:center;text-align:center;max-width:520px;margin:0 auto;';
74 }
75
76 /* Cover */
77 if (o.layout !== 'minimal' && o.coverUrl) {
78 var coverWrap = document.createElement('div');
79 coverWrap.className = 'bkbg-ebk-cover-wrap';
80 coverWrap.style.cssText = 'position:relative;flex-shrink:0;perspective:600px;';
81
82 var img = document.createElement('img');
83 img.className = 'bkbg-ebk-cover' + (o.show3D ? ' bkbg-ebk-cover-3d' : '');
84 img.src = o.coverUrl;
85 img.alt = o.coverAlt || o.title;
86 img.style.cssText = 'width:220px;max-width:100%;border-radius:6px;display:block;' + (o.show3D ? 'transform:rotateY(-8deg);box-shadow:8px 8px 24px ' + o.coverShadow + ';' : 'box-shadow:4px 4px 16px ' + o.coverShadow + ';');
87
88 var badge = document.createElement('span');
89 badge.className = 'bkbg-ebk-format-badge';
90 badge.style.cssText = 'position:absolute;top:6px;right:6px;background:' + o.formatBadgeBg + ';color:' + o.formatBadgeColor + ';font-size:11px;padding:2px 8px;border-radius:4px;font-weight:700;';
91 badge.textContent = fmtLabel;
92
93 coverWrap.appendChild(img);
94 coverWrap.appendChild(badge);
95 layout.appendChild(coverWrap);
96 }
97
98 /* Content */
99 var content = document.createElement('div');
100 content.className = 'bkbg-ebk-content';
101 content.style.cssText = 'flex:1;min-width:280px;';
102
103 /* Format badge above title */
104 var topBadge = document.createElement('span');
105 topBadge.className = 'bkbg-ebk-badge';
106 topBadge.style.cssText = 'display:inline-block;background:' + o.formatBadgeBg + ';color:' + o.formatBadgeColor + ';font-size:12px;padding:3px 10px;border-radius:20px;font-weight:700;margin-bottom:8px;';
107 topBadge.textContent = fmtLabel;
108 content.appendChild(topBadge);
109
110 var title = document.createElement('h2');
111 title.className = 'bkbg-ebk-title';
112 title.style.color = o.titleColor;
113 title.innerHTML = o.title;
114 content.appendChild(title);
115
116 if (o.subtitle) {
117 var sub = document.createElement('p');
118 sub.className = 'bkbg-ebk-subtitle';
119 sub.style.color = o.subtitleColor;
120 sub.innerHTML = o.subtitle;
121 content.appendChild(sub);
122 }
123
124 var priceRow = document.createElement('div');
125 priceRow.className = 'bkbg-ebk-price-row';
126 priceRow.style.cssText = 'display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap;';
127
128 if (o.price) {
129 var pr = document.createElement('span');
130 pr.className = 'bkbg-ebk-price';
131 pr.style.color = o.priceColor;
132 pr.textContent = o.price;
133 priceRow.appendChild(pr);
134 }
135 if (o.originalPrice) {
136 var op = document.createElement('span');
137 op.style.cssText = 'font-size:16px;text-decoration:line-through;color:' + o.origPriceColor + ';';
138 op.textContent = o.originalPrice;
139 priceRow.appendChild(op);
140 }
141 if (o.pageCount) {
142 var pc = document.createElement('span');
143 pc.style.cssText = 'font-size:12px;color:' + o.authorColor + ';';
144 pc.textContent = '· ' + o.pageCount;
145 priceRow.appendChild(pc);
146 }
147 content.appendChild(priceRow);
148
149 /* Feature list */
150 if (o.whatInside && o.whatInside.length) {
151 var ul = document.createElement('ul');
152 ul.className = 'bkbg-ebk-list';
153 ul.style.cssText = 'list-style:none;padding:0;margin:0 0 16px;';
154 var _IP = window.bkbgIconPicker;
155 o.whatInside.forEach(function (it) {
156 var li = document.createElement('li');
157 li.className = 'bkbg-ebk-list-item';
158 li.style.cssText = 'display:flex;align-items:flex-start;gap:8px;margin-bottom:7px;font-size:14px;line-height:1.5;color:' + o.itemColor + ';';
159 var iconSpan = document.createElement('span');
160 iconSpan.style.cssText = 'flex-shrink:0;font-size:15px;margin-top:1px;';
161 var _iType = it.iconType || 'custom-char';
162 if (_IP && _iType !== 'custom-char') {
163 var _in = _IP.buildFrontendIcon(_iType, it.icon, it.iconDashicon, it.iconImageUrl, it.iconDashiconColor);
164 if (_in) iconSpan.appendChild(_in);
165 else iconSpan.textContent = it.icon || '�
166 ';
167 } else {
168 iconSpan.textContent = it.icon || '�
169 ';
170 }
171 li.appendChild(iconSpan);
172 var textSpan = document.createElement('span');
173 textSpan.textContent = it.item || '';
174 li.appendChild(textSpan);
175 ul.appendChild(li);
176 });
177 content.appendChild(ul);
178 }
179
180 /* Testimonial */
181 if (o.showTestimonial && o.testimonialQuote) {
182 var tbox = document.createElement('div');
183 tbox.className = 'bkbg-ebk-testimonial';
184 tbox.style.cssText = 'background:' + o.testimonialBg + ';border-radius:8px;padding:14px 16px;margin-bottom:16px;';
185 tbox.innerHTML =
186 '<div style="font-size:28px;line-height:1;margin-bottom:4px;color:' + o.quoteColor + ';font-family:Georgia,serif;">"</div>' +
187 '<p style="margin:0 0 8px;font-size:13px;font-style:italic;line-height:1.6;color:' + o.testimonialColor + ';">' + esc(o.testimonialQuote) + '</p>' +
188 '<div style="font-size:12px;font-weight:600;color:' + o.authorColor + ';">' + esc(o.testimonialName) + '</div>';
189 content.appendChild(tbox);
190 }
191
192 /* CTA */
193 var cta = document.createElement('a');
194 cta.className = 'bkbg-ebk-cta';
195 cta.href = o.ctaUrl || '#';
196 cta.target = target;
197 if (o.openInNewTab) cta.rel = 'noopener noreferrer';
198 cta.style.cssText = 'background:' + o.ctaBg + ';color:' + o.ctaColor + ';';
199 cta.textContent = o.ctaLabel;
200 cta.addEventListener('mouseenter', function () { this.style.opacity = '0.9'; this.style.transform = 'translateY(-1px)'; });
201 cta.addEventListener('mouseleave', function () { this.style.opacity = '1'; this.style.transform = ''; });
202 content.appendChild(cta);
203
204 layout.appendChild(content);
205 inner.appendChild(layout);
206 section.appendChild(inner);
207 el.parentNode.insertBefore(section, el);
208 });
209 }
210
211 function esc(str) {
212 return String(str || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
213 }
214
215 if (document.readyState !== 'loading') { init(); }
216 else { document.addEventListener('DOMContentLoaded', init); }
217 })();
218