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

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

175 lines 8.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 var _typoKeys = {
3 family: 'font-family', weight: 'font-weight', style: 'font-style',
4 decoration: 'text-decoration', transform: 'text-transform',
5 sizeDesktop: 'font-size-d', sizeTablet: 'font-size-t', sizeMobile: 'font-size-m',
6 lineHeightDesktop: 'line-height-d', lineHeightTablet: 'line-height-t', lineHeightMobile: 'line-height-m',
7 letterSpacing: 'letter-spacing', wordSpacing: 'word-spacing'
8 };
9 function typoCssVarsForEl(el, typo, prefix) {
10 if (!typo || typeof typo !== 'object') return;
11 Object.keys(typo).forEach(function (k) {
12 var v = typo[k]; if (v === '' || v == null) return;
13 var css = _typoKeys[k]; if (!css) return;
14 if ((k === 'letterSpacing' || k === 'wordSpacing') && typeof v === 'number') v = v + 'px';
15 if ((/^(sizeDesktop|sizeTablet|sizeMobile)$/).test(k) && typeof v === 'number') v = v + 'px';
16 el.style.setProperty(prefix + css, '' + v);
17 });
18 }
19
20 function init() {
21 document.querySelectorAll('.bkbg-lis-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 heading: '', showHeading: false,
28 items: [], layout: 'list', numberStyle: 'badge',
29 showNumbers: true, showImages: true, showRatings: false,
30 showTags: true, showVerdicts: false, countDown: false,
31 imageRatio: '16:9', imageRadius: 8, gap: 24, cardRadius: 12,
32 paddingTop: 0, paddingBottom: 0,
33 bgColor: '', cardBg: '#ffffff', cardBorder: '#e5e7eb',
34 numberBg: '#6366f1', numberColor: '#ffffff',
35 titleColor: '#111827', subtitleColor: '#6b7280', descColor: '#374151',
36 tagBg: '#ede9fe', tagColor: '#6366f1',
37 verdictBg: '#dcfce7', verdictColor: '#15803d',
38 starColor: '#f59e0b', accentColor: '#6366f1'
39 }, opts);
40
41 var RATIO = { '16:9': '56.25%', '4:3': '75%', '1:1': '100%', '3:4': '133.333%' };
42
43 function mk(tag, cls, style, text) {
44 var n = document.createElement(tag);
45 if (cls) n.className = cls;
46 if (style) Object.assign(n.style, style);
47 if (text != null) n.textContent = text;
48 return n;
49 }
50
51 function numBadge(num) {
52 if (o.numberStyle === 'badge') {
53 return mk('div', 'bkbg-lis-badge', { background: o.numberBg, color: o.numberColor }, num);
54 } else if (o.numberStyle === 'circle') {
55 return mk('div', 'bkbg-lis-circle', { borderColor: o.numberBg, color: o.numberBg }, num);
56 } else if (o.numberStyle === 'large') {
57 return mk('div', 'bkbg-lis-num-large', { color: o.numberBg }, num);
58 } else {
59 return mk('div', 'bkbg-lis-num-minimal', { color: o.numberBg }, '#' + num);
60 }
61 }
62
63 function stars(rating) {
64 var wrap = mk('div', 'bkbg-lis-stars');
65 for (var i = 1; i <= 5; i++) {
66 wrap.appendChild(mk('span', '', { color: i <= rating ? o.starColor : '#d1d5db' }, '�
67 '));
68 }
69 return wrap;
70 }
71
72 var section = mk('div', 'bkbg-lis-section', {
73 background: o.bgColor || undefined,
74 paddingTop: o.paddingTop + 'px',
75 paddingBottom: o.paddingBottom + 'px'
76 });
77
78 typoCssVarsForEl(section, o.headingTypo, '--bkbg-lis-h-');
79 typoCssVarsForEl(section, o.titleTypo, '--bkbg-lis-tt-');
80 typoCssVarsForEl(section, o.descTypo, '--bkbg-lis-d-');
81
82 if (o.showHeading && o.heading) {
83 section.appendChild(mk('h2', 'bkbg-lis-heading', { color: o.titleColor }, o.heading));
84 }
85
86 var layoutClass = 'bkbg-lis-' + (o.layout || 'list');
87 var listWrap = mk('div', layoutClass, { gap: o.gap + 'px', gridTemplateColumns: o.layout === 'grid' ? 'repeat(2,1fr)' : undefined });
88
89 (o.items || []).forEach(function (item, idx) {
90 var cardinal = o.countDown ? (o.items.length - idx) : (idx + 1);
91 var isOdd = idx % 2 === 1;
92
93 var card = mk('div', 'bkbg-lis-card' + (o.layout === 'magazine' && isOdd ? ' bkbg-lis-odd' : ''), {
94 background: o.cardBg, borderColor: o.cardBorder, borderRadius: o.cardRadius + 'px'
95 });
96
97 /* image */
98 if (o.showImages) {
99 var imgWrap = mk('div', 'bkbg-lis-img-wrap');
100 if (o.layout === 'list') { imgWrap.style.width = '220px'; }
101 else if (o.layout === 'magazine') { imgWrap.style.width = '44%'; }
102
103 var imgPad = mk('div', 'bkbg-lis-img-pad');
104 if (o.layout === 'grid') { imgPad.style.paddingBottom = RATIO[o.imageRatio] || '56.25%'; }
105 imgWrap.appendChild(imgPad);
106
107 if (item.imageUrl) {
108 var img = document.createElement('img');
109 img.src = item.imageUrl;
110 img.alt = item.imageAlt || '';
111 img.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-fit:cover';
112 if (o.layout !== 'grid') { img.style.borderRadius = o.imageRadius + 'px'; }
113 imgPad.appendChild(img);
114 }
115
116 if (o.showNumbers && o.numberStyle !== 'large') {
117 var numOvl = mk('div', 'bkbg-lis-num-overlay');
118 numOvl.appendChild(numBadge(cardinal));
119 imgPad.appendChild(numOvl);
120 }
121 card.appendChild(imgWrap);
122 }
123
124 /* content */
125 var content = mk('div', 'bkbg-lis-content');
126
127 /* number inside content (no image or large style) */
128 if (o.showNumbers && (!o.showImages || o.numberStyle === 'large')) {
129 var numEl = mk('div', 'bkbg-lis-num-inline');
130 numEl.appendChild(numBadge(cardinal));
131 content.appendChild(numEl);
132 }
133
134 /* meta row */
135 if ((o.showTags && item.tag) || (o.showVerdicts && item.verdict)) {
136 var meta = mk('div', 'bkbg-lis-meta');
137 if (o.showTags && item.tag) {
138 meta.appendChild(mk('span', 'bkbg-lis-tag', { background: o.tagBg, color: o.tagColor }, item.tag));
139 }
140 if (o.showVerdicts && item.verdict) {
141 meta.appendChild(mk('span', 'bkbg-lis-verdict', { background: o.verdictBg, color: o.verdictColor }, item.verdict));
142 }
143 content.appendChild(meta);
144 }
145
146 /* title */
147 var title = mk('h3', 'bkbg-lis-title', { color: o.titleColor }, '');
148 title.innerHTML = item.title || '';
149 content.appendChild(title);
150
151 if (item.subtitle) {
152 content.appendChild(mk('p', 'bkbg-lis-subtitle', { color: o.subtitleColor }, item.subtitle));
153 }
154
155 if (o.showRatings) { content.appendChild(stars(item.rating || 5)); }
156
157 if (item.description) {
158 var desc = mk('p', 'bkbg-lis-desc', { color: o.descColor }, '');
159 desc.innerHTML = item.description;
160 content.appendChild(desc);
161 }
162
163 card.appendChild(content);
164 listWrap.appendChild(card);
165 });
166
167 section.appendChild(listWrap);
168 el.parentNode.insertBefore(section, el);
169 });
170 }
171
172 if (document.readyState !== 'loading') { init(); }
173 else { document.addEventListener('DOMContentLoaded', init); }
174 })();
175