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 / survey-results / frontend.js

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

184 lines 7.7 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 var _typoKeys = {
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 function typoCssVarsForEl(el, obj, prefix) {
13 if (!obj || typeof obj !== 'object') return;
14 Object.keys(_typoKeys).forEach(function (k) {
15 var v = obj[k];
16 if (v === undefined || v === '' || v === null) return;
17 if (k === 'sizeDesktop' || k === 'sizeTablet' || k === 'sizeMobile') v = v + (obj.sizeUnit || 'px');
18 else if (k === 'lineHeightDesktop' || k === 'lineHeightTablet' || k === 'lineHeightMobile') v = v + (obj.lineHeightUnit || '');
19 else if (k === 'letterSpacingDesktop' || k === 'letterSpacingTablet' || k === 'letterSpacingMobile') v = v + (obj.letterSpacingUnit || 'px');
20 else if (k === 'wordSpacingDesktop' || k === 'wordSpacingTablet' || k === 'wordSpacingMobile') v = v + (obj.wordSpacingUnit || 'px');
21 el.style.setProperty(prefix + _typoKeys[k], String(v));
22 });
23 }
24
25 function mk(tag, cls, styles) {
26 var d = document.createElement(tag);
27 if (cls) d.className = cls;
28 if (styles) Object.keys(styles).forEach(function (k) { d.style[k] = styles[k]; });
29 return d;
30 }
31 function tx(tag, cls, text, styles) {
32 var d = mk(tag, cls, styles);
33 d.textContent = text;
34 return d;
35 }
36 function ap(parent) {
37 Array.prototype.slice.call(arguments, 1).forEach(function (c) { if (c) parent.appendChild(c); });
38 return parent;
39 }
40
41 function fmtN(n) {
42 if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
43 if (n >= 1000) return (n / 1000).toFixed(0) + 'k';
44 return String(n);
45 }
46
47 function buildBlock(appEl) {
48 if (appEl.dataset.rendered) return;
49 appEl.dataset.rendered = '1';
50
51 var a = Object.assign({
52 surveyTitle: '', organization: '', respondents: 0, respondentsLabel: 'respondents',
53 surveyDate: '', showMeta: true, questions: [],
54 showPercentages: true, showCounts: false, showBars: true, highlightWinner: true,
55 methodology: '', showMethodology: true,
56 fontSize: 14, titleFontSize: 22, lineHeight: 168, borderRadius: 12, barHeight: 10,
57 bgColor: '#ffffff', borderColor: '#e5e7eb', headerBg: '#0f172a', headerColor: '#ffffff',
58 metaColor: '#94a3b8', questionColor: '#111827', labelColor: '#374151',
59 percentColor: '#111827', countColor: '#6b7280',
60 barBg: '#f1f5f9', barFill: '#3b82f6', barFillWinner: '#1d4ed8', winnerBg: '#eff6ff',
61 methodologyBg: '#f8fafc', methodologyColor: '#6b7280'
62 }, JSON.parse(appEl.dataset.opts || '{}'));
63
64 var wrap = mk('div', 'bkbg-sr-wrap');
65 wrap.style.border = '1px solid ' + a.borderColor;
66 wrap.style.borderRadius = a.borderRadius + 'px';
67 wrap.style.overflow = 'hidden';
68 wrap.style.background = a.bgColor;
69
70 typoCssVarsForEl(wrap, a.titleTypo, '--bksr-tt-');
71 typoCssVarsForEl(wrap, a.textTypo, '--bksr-tx-');
72
73 // ---- Header ----
74 var header = mk('div', 'bkbg-sr-header');
75 header.style.background = a.headerBg;
76
77 var title = tx('h2', 'bkbg-sr-title', a.surveyTitle);
78 title.style.color = a.headerColor;
79 ap(header, title);
80
81 if (a.showMeta) {
82 var meta = mk('div', 'bkbg-sr-meta');
83 var metaItems = [];
84 if (a.organization) metaItems.push('🏢 ' + a.organization);
85 if (a.respondents) metaItems.push('👥 ' + Number(a.respondents).toLocaleString() + ' ' + a.respondentsLabel);
86 if (a.surveyDate) metaItems.push('�
87 ' + a.surveyDate);
88 metaItems.forEach(function (m) {
89 var s = tx('span', 'bkbg-sr-meta-item', m);
90 s.style.color = a.metaColor;
91 ap(meta, s);
92 });
93 ap(header, meta);
94 }
95 ap(wrap, header);
96
97 // ---- Questions ----
98 a.questions.forEach(function (q, qi) {
99 var maxPct = Math.max.apply(null, q.options.map(function (o) { return o.percent; }));
100
101 var qDiv = mk('div', 'bkbg-sr-question');
102 if (qi > 0) {
103 qDiv.style.borderTopColor = a.borderColor;
104 }
105
106 var qText = tx('p', 'bkbg-sr-q-text', (qi + 1) + '. ' + q.question);
107 qText.style.color = a.questionColor;
108 ap(qDiv, qText);
109
110 q.options.forEach(function (opt) {
111 var isWinner = a.highlightWinner && opt.percent === maxPct;
112
113 var optDiv = mk('div', 'bkbg-sr-option');
114 if (isWinner) optDiv.style.background = a.winnerBg;
115
116 // Label row
117 var row = mk('div', 'bkbg-sr-option-row');
118 var label = tx('span', 'bkbg-sr-option-label' + (isWinner ? ' winner' : ''), opt.label);
119 label.style.color = a.labelColor;
120
121 var stats = mk('span', 'bkbg-sr-option-stats');
122 if (a.showPercentages) {
123 var pct = tx('strong', 'bkbg-sr-pct', opt.percent + '%');
124 pct.style.color = a.percentColor;
125 ap(stats, pct);
126 }
127 if (a.showCounts && opt.count) {
128 var cnt = tx('span', 'bkbg-sr-count', '(' + fmtN(opt.count) + ')');
129 cnt.style.color = a.countColor;
130 ap(stats, cnt);
131 }
132 ap(row, label, stats);
133 ap(optDiv, row);
134
135 // Bar
136 if (a.showBars) {
137 var track = mk('div', 'bkbg-sr-bar-track');
138 track.style.height = a.barHeight + 'px';
139 track.style.background = a.barBg;
140 var fill = mk('div', 'bkbg-sr-bar-fill');
141 fill.style.width = opt.percent + '%';
142 fill.style.height = '100%';
143 fill.style.background = isWinner ? a.barFillWinner : a.barFill;
144 ap(track, fill);
145 ap(optDiv, track);
146 }
147
148 ap(qDiv, optDiv);
149 });
150
151 ap(wrap, qDiv);
152 });
153
154 // ---- Methodology ----
155 if (a.showMethodology && a.methodology) {
156 var mDiv = mk('div', 'bkbg-sr-methodology');
157 mDiv.style.background = a.methodologyBg;
158 mDiv.style.borderTop = '1px solid ' + a.borderColor;
159
160 var mText = document.createElement('p');
161 mText.className = 'bkbg-sr-method-text';
162 mText.style.color = a.methodologyColor;
163 mText.style.fontSize = (a.fontSize - 1) + 'px';
164
165 var strong = document.createElement('strong');
166 strong.textContent = 'Methodology: ';
167 mText.appendChild(strong);
168 mText.appendChild(document.createTextNode(a.methodology));
169 ap(mDiv, mText);
170 ap(wrap, mDiv);
171 }
172
173 appEl.innerHTML = '';
174 appEl.appendChild(wrap);
175 }
176
177 function init() {
178 document.querySelectorAll('.bkbg-survey-results-app').forEach(buildBlock);
179 }
180
181 if (document.readyState !== 'loading') { init(); }
182 else { document.addEventListener('DOMContentLoaded', init); }
183 })();
184