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 / comparison-guide / frontend.js

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

244 lines 10.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 'use strict';
3
4 function mk(tag, cls, styles) {
5 var d = document.createElement(tag);
6 if (cls) d.className = cls;
7 if (styles) Object.keys(styles).forEach(function (k) { d.style[k] = styles[k]; });
8 return d;
9 }
10 function tx(tag, cls, text, styles) {
11 var d = mk(tag, cls, styles);
12 d.textContent = text;
13 return d;
14 }
15 function ap(parent) {
16 Array.prototype.slice.call(arguments, 1).forEach(function (c) { if (c) parent.appendChild(c); });
17 return parent;
18 }
19 var _typoKeys = {
20 family:'font-family', weight:'font-weight', style:'font-style',
21 transform:'text-transform', decoration:'text-decoration',
22 sizeDesktop:'font-size-d', sizeTablet:'font-size-t', sizeMobile:'font-size-m',
23 lineHeightDesktop:'line-height-d', lineHeightTablet:'line-height-t', lineHeightMobile:'line-height-m',
24 letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
25 wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m'
26 };
27 var _typoUnits = { size:'sizeUnit', lineHeight:'lineHeightUnit', letterSpacing:'letterSpacingUnit', wordSpacing:'wordSpacingUnit' };
28 var _typoUnitDefaults = { size:'px', lineHeight:'', letterSpacing:'px', wordSpacing:'px' };
29 function typoCssVarsForEl(el, obj, prefix) {
30 if (!obj || typeof obj !== 'object') return;
31 Object.keys(_typoKeys).forEach(function (k) {
32 var v = obj[k]; if (v === undefined || v === '') return;
33 var prop = _typoKeys[k];
34 var base = k.replace(/Desktop|Tablet|Mobile/, '');
35 var uKey = _typoUnits[base];
36 if (uKey && typeof v === 'number') v = v + (obj[uKey] || _typoUnitDefaults[base] || '');
37 el.style.setProperty(prefix + prop, v);
38 });
39 }
40
41 function winnerBadge(winner, nameA, nameB, a) {
42 var label, bg, color;
43 if (winner === 'tie') {
44 label = '— Tie'; bg = a.tieBg; color = a.tieColor;
45 } else {
46 label = '🏆 ' + (winner === 'A' ? nameA : nameB);
47 bg = a.winnerBadgeBg; color = a.winnerBadgeColor;
48 }
49 var s = mk('span', 'bkbg-cg-badge');
50 s.textContent = label;
51 s.style.background = bg;
52 s.style.color = color;
53 return s;
54 }
55
56 function buildBlock(appEl) {
57 if (appEl.dataset.rendered) return;
58 appEl.dataset.rendered = '1';
59
60 var a = Object.assign({
61 guideTitle: '', intro: '', showIntro: true,
62 nameA: 'A', descA: '', emojiA: '�
63 �️', scoreA: 80, showScores: true,
64 emojiAType: 'custom-char', emojiADashicon: '', emojiAImageUrl: '',
65 nameB: 'B', descB: '', emojiB: '�
66 �️', scoreB: 80,
67 emojiBType: 'custom-char', emojiBDashicon: '', emojiBImageUrl: '',
68 criteria: [], showNotes: true, showCritScores: true,
69 verdictWinner: 'A', verdictSummary: '', showVerdict: true,
70 fontSize: 14, titleFontSize: 24, lineHeight: 170, borderRadius: 12,
71 bgColor: '#ffffff', borderColor: '#e5e7eb', headerBg: '#f8fafc',
72 titleColor: '#0f172a', introColor: '#374151',
73 colABg: '#eff6ff', colAColor: '#1e3a8a',
74 colBBg: '#f0fdf4', colBColor: '#14532d',
75 winnerBadgeBg: '#fef9c3', winnerBadgeColor: '#713f12',
76 tieBg: '#f1f5f9', tieColor: '#475569',
77 notesColor: '#6b7280', rowAltBg: '#f8fafc',
78 verdictBg: '#0f172a', verdictColor: '#ffffff',
79 accentColor: '#3b82f6'
80 }, JSON.parse(appEl.dataset.opts || '{}'));
81
82 var wrap = mk('div', 'bkbg-cg-wrap');
83 wrap.style.border = '1px solid ' + a.borderColor;
84 wrap.style.borderRadius = a.borderRadius + 'px';
85 wrap.style.overflow = 'hidden';
86 wrap.style.background = a.bgColor;
87 typoCssVarsForEl(wrap, a.typoTitle, '--bkcg-title-');
88 typoCssVarsForEl(wrap, a.typoBody, '--bkcg-body-');
89
90 // ---- Header ----
91 var header = mk('div', 'bkbg-cg-header');
92 header.style.background = a.headerBg;
93 header.style.borderBottom = '1px solid ' + a.borderColor;
94
95 var title = tx('h2', 'bkbg-cg-title', a.guideTitle);
96 title.style.color = a.titleColor;
97 ap(header, title);
98
99 if (a.showIntro && a.intro) {
100 var intro = tx('p', 'bkbg-cg-intro', a.intro);
101 intro.style.color = a.introColor;
102 ap(header, intro);
103 }
104 ap(wrap, header);
105
106 // ---- A vs B columns ----
107 var cols = mk('div', 'bkbg-cg-cols');
108 cols.style.borderBottom = '1px solid ' + a.borderColor;
109
110 function makeItemCol(name, emoji, desc, score, bg, color, emojiType, emojiDashicon, emojiImageUrl, emojiDashiconColor) {
111 var col = mk('div', 'bkbg-cg-item');
112 col.style.background = bg;
113 var eEl = mk('div', 'bkbg-cg-emoji');
114 var IP = window.bkbgIconPicker;
115 if (IP && emojiType && emojiType !== 'custom-char') {
116 var iconNode = IP.buildFrontendIcon(emojiType, emoji, emojiDashicon, emojiImageUrl, emojiDashiconColor);
117 if (iconNode) eEl.appendChild(iconNode);
118 else eEl.textContent = emoji;
119 } else {
120 eEl.textContent = emoji;
121 }
122 var nEl = tx('div', 'bkbg-cg-item-name', name);
123 nEl.style.color = color;
124 var dEl = tx('div', 'bkbg-cg-item-desc', desc);
125 dEl.style.color = color;
126 ap(col, eEl, nEl, dEl);
127 if (a.showScores) {
128 var sNum = tx('div', 'bkbg-cg-score-num', score);
129 sNum.style.color = color;
130 var sLab = tx('div', 'bkbg-cg-score-label', 'Overall Score');
131 sLab.style.color = color;
132 ap(col, sNum, sLab);
133 }
134 return col;
135 }
136
137 var colA = makeItemCol(a.nameA, a.emojiA, a.descA, a.scoreA, a.colABg, a.colAColor, a.emojiAType, a.emojiADashicon, a.emojiAImageUrl, a.emojiADashiconColor);
138 var vs = tx('div', 'bkbg-cg-vs', 'VS');
139 var colB = makeItemCol(a.nameB, a.emojiB, a.descB, a.scoreB, a.colBBg, a.colBColor, a.emojiBType, a.emojiBDashicon, a.emojiBImageUrl, a.emojiBDashiconColor);
140 ap(cols, colA, vs, colB);
141 ap(wrap, cols);
142
143 // ---- Table header ----
144 var tblHead = mk('div', 'bkbg-cg-tbl-head');
145 var thCells = ['Criterion', a.nameA, a.nameB, 'Winner'];
146 thCells.forEach(function (label, i) {
147 var cell = tx('div', 'bkbg-cg-tbl-head-cell' + (i > 0 ? ' center' : ''), label);
148 ap(tblHead, cell);
149 });
150 ap(wrap, tblHead);
151
152 // ---- Criteria rows ----
153 a.criteria.forEach(function (crit, i) {
154 var isAlt = i % 2 === 1;
155 var rowBg = isAlt ? a.rowAltBg : a.bgColor;
156 var bdrColor = a.borderColor;
157
158 var row = mk('div', 'bkbg-cg-row');
159 row.style.background = rowBg;
160 row.style.borderTop = (i === 0 ? 'none' : '1px solid ' + bdrColor);
161
162 // Criterion name
163 var nameCell = tx('div', 'bkbg-cg-crit-name', crit.name);
164 nameCell.style.color = a.titleColor;
165 ap(row, nameCell);
166
167 // Scores
168 if (a.showCritScores) {
169 var sA = tx('div', 'bkbg-cg-crit-score', crit.scoreA);
170 sA.style.color = a.colAColor;
171 var sB = tx('div', 'bkbg-cg-crit-score', crit.scoreB);
172 sB.style.color = a.colBColor;
173 ap(row, sA, sB);
174 } else {
175 ap(row, mk('div'), mk('div'));
176 }
177
178 // Winner badge
179 var winnerCol = mk('div', 'bkbg-cg-winner-col');
180 ap(winnerCol, winnerBadge(crit.winner, a.nameA, a.nameB, a));
181 ap(row, winnerCol);
182 ap(wrap, row);
183
184 // Notes
185 if (a.showNotes && crit.notes) {
186 var notes = tx('div', 'bkbg-cg-notes', crit.notes);
187 notes.style.background = rowBg;
188 notes.style.color = a.notesColor;
189 notes.style.borderTop = '1px dashed ' + bdrColor;
190 ap(wrap, notes);
191 }
192 });
193
194 // ---- Verdict ----
195 if (a.showVerdict) {
196 var verdict = mk('div', 'bkbg-cg-verdict');
197 verdict.style.background = a.verdictBg;
198 verdict.style.color = a.verdictColor;
199 verdict.style.borderTop = '1px solid rgba(255,255,255,.08)';
200
201 var eyebrow = tx('div', 'bkbg-cg-verdict-eyebrow', 'Verdict');
202 var winnerRow = mk('div', 'bkbg-cg-verdict-winner');
203
204 var vName, vEmoji;
205 if (a.verdictWinner === 'A') { vName = a.nameA; vEmoji = a.emojiA; }
206 else if (a.verdictWinner === 'B') { vName = a.nameB; vEmoji = a.emojiB; }
207 else { vName = 'Tie'; vEmoji = '🤝'; }
208
209 var vNameEl = tx('div', 'bkbg-cg-verdict-name', vName + ' wins');
210 var vEmEl = mk('div', 'bkbg-cg-verdict-emoji');
211 var vIP = window.bkbgIconPicker;
212 var vEmojiType = a.verdictWinner === 'A' ? a.emojiAType : (a.verdictWinner === 'B' ? a.emojiBType : '');
213 var vEmojiDash = a.verdictWinner === 'A' ? a.emojiADashicon : (a.verdictWinner === 'B' ? a.emojiBDashicon : '');
214 var vEmojiImg = a.verdictWinner === 'A' ? a.emojiAImageUrl : (a.verdictWinner === 'B' ? a.emojiBImageUrl : '');
215 var vEmojiDashColor = a.verdictWinner === 'A' ? a.emojiADashiconColor : (a.verdictWinner === 'B' ? a.emojiBDashiconColor : '');
216 if (vIP && vEmojiType && vEmojiType !== 'custom-char') {
217 var vIconNode = vIP.buildFrontendIcon(vEmojiType, vEmoji, vEmojiDash, vEmojiImg, vEmojiDashColor);
218 if (vIconNode) vEmEl.appendChild(vIconNode);
219 else vEmEl.textContent = vEmoji;
220 } else {
221 vEmEl.textContent = vEmoji;
222 }
223 ap(winnerRow, vNameEl, vEmEl);
224 ap(verdict, eyebrow, winnerRow);
225
226 if (a.verdictSummary) {
227 var vSum = tx('p', 'bkbg-cg-verdict-summary', a.verdictSummary);
228 ap(verdict, vSum);
229 }
230 ap(wrap, verdict);
231 }
232
233 appEl.innerHTML = '';
234 appEl.appendChild(wrap);
235 }
236
237 function init() {
238 document.querySelectorAll('.bkbg-comparison-guide-app').forEach(buildBlock);
239 }
240
241 if (document.readyState !== 'loading') { init(); }
242 else { document.addEventListener('DOMContentLoaded', init); }
243 })();
244