PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.11
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.11
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 / reading-card / frontend.js

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

171 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 var TYPE_ICONS = { book: '📚', article: '📄', podcast: '🎙️', course: '🎓', video: '🎬' };
3 var TYPE_LABELS = { book: 'Book', article: 'Article', podcast: 'Podcast', course: 'Course', video: 'Video' };
4
5 var _typoKeys = {
6 family:'font-family', weight:'font-weight', style:'font-style',
7 decoration:'text-decoration', transform:'text-transform',
8 sizeDesktop:'font-size-d', sizeTablet:'font-size-t', sizeMobile:'font-size-m',
9 lineHeightDesktop:'line-height-d', lineHeightTablet:'line-height-t', lineHeightMobile:'line-height-m',
10 letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
11 wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m'
12 };
13 function typoCssVarsForEl(el, obj, prefix) {
14 if (!obj || typeof obj !== 'object') return;
15 Object.keys(_typoKeys).forEach(function (k) {
16 var v = obj[k];
17 if (v === undefined || v === '' || v === null) return;
18 if (k === 'sizeDesktop' || k === 'sizeTablet' || k === 'sizeMobile') v = v + (obj.sizeUnit || 'px');
19 else if (k === 'lineHeightDesktop' || k === 'lineHeightTablet' || k === 'lineHeightMobile') v = v + (obj.lineHeightUnit || '');
20 else if (k === 'letterSpacingDesktop' || k === 'letterSpacingTablet' || k === 'letterSpacingMobile') v = v + (obj.letterSpacingUnit || 'px');
21 else if (k === 'wordSpacingDesktop' || k === 'wordSpacingTablet' || k === 'wordSpacingMobile') v = v + (obj.wordSpacingUnit || 'px');
22 el.style.setProperty(prefix + _typoKeys[k], String(v));
23 });
24 }
25
26 document.querySelectorAll('.bkbg-rdc-app').forEach(function (app) {
27 var opts = {};
28 try { opts = JSON.parse(app.dataset.opts || '{}'); } catch (e) { }
29
30 var coverUrl = opts.coverUrl || '';
31 var coverAlt = opts.coverAlt || '';
32 var contentType = opts.contentType || 'book';
33 var badge = opts.badge || TYPE_LABELS[contentType] || 'Book';
34 var title = opts.title || '';
35 var author = opts.author || '';
36 var description = opts.description || '';
37 var rating = opts.rating !== undefined ? opts.rating : 0;
38 var showRating = opts.showRating !== false;
39 var ctaLabel = opts.ctaLabel || 'Read more →';
40 var ctaUrl = opts.ctaUrl || '#';
41 var ctaIsExternal = opts.ctaIsExternal || false;
42 var layout = opts.layout || 'horizontal';
43 var badgeBg = opts.badgeBg || '#7c3aed';
44 var badgeColor = opts.badgeColor || '#ffffff';
45 var titleColor = opts.titleColor || '#111827';
46 var authorColor = opts.authorColor || '#6b7280';
47 var descColor = opts.descColor || '#374151';
48 var ratingColor = opts.ratingColor || '#f59e0b';
49 var ctaColor = opts.ctaColor || '#7c3aed';
50 var bgColor = opts.bgColor || '#ffffff';
51 var borderColor = opts.borderColor || '#e5e7eb';
52 var borderRadius = opts.borderRadius !== undefined ? opts.borderRadius : 12;
53 var coverWidth = opts.coverWidth || 120;
54 var maxWidth = opts.maxWidth || 720;
55 var paddingTop = opts.paddingTop !== undefined ? opts.paddingTop : 32;
56 var paddingBottom = opts.paddingBottom !== undefined ? opts.paddingBottom : 32;
57
58 /* outer wrap */
59 var wrap = document.createElement('div');
60 wrap.className = 'bkbg-rdc-wrap';
61 wrap.style.cssText = 'padding-top:' + paddingTop + 'px;padding-bottom:' + paddingBottom + 'px;';
62 typoCssVarsForEl(wrap, opts.titleTypo || {}, '--bkrdc-tt-');
63 typoCssVarsForEl(wrap, opts.authorTypo || {}, '--bkrdc-at-');
64 typoCssVarsForEl(wrap, opts.descTypo || {}, '--bkrdc-dt-');
65
66 /* card */
67 var card = document.createElement('div');
68 card.className = 'bkbg-rdc-card bkbg-rdc-card--' + layout;
69 card.style.cssText = [
70 'background:' + bgColor,
71 'border-color:' + borderColor,
72 'border-radius:' + borderRadius + 'px',
73 'max-width:' + maxWidth + 'px'
74 ].join(';');
75 if (layout === 'minimal') {
76 card.style.borderBottomColor = borderColor;
77 }
78
79 /* cover */
80 if (layout !== 'minimal' && coverUrl) {
81 var img = document.createElement('img');
82 img.className = 'bkbg-rdc-cover';
83 img.src = coverUrl;
84 img.alt = coverAlt;
85 img.style.cssText = layout === 'vertical'
86 ? 'width:100%;height:200px;'
87 : 'width:' + coverWidth + 'px;min-width:' + coverWidth + 'px;height:' + Math.round(coverWidth * 1.4) + 'px;';
88 card.appendChild(img);
89 } else if (layout !== 'minimal' && !coverUrl) {
90 var ph = document.createElement('div');
91 ph.className = 'bkbg-rdc-cover-placeholder';
92 ph.style.cssText = layout === 'vertical'
93 ? 'width:100%;height:200px;'
94 : 'width:' + coverWidth + 'px;min-width:' + coverWidth + 'px;height:' + Math.round(coverWidth * 1.4) + 'px;';
95 ph.textContent = TYPE_ICONS[contentType] || '📚';
96 card.appendChild(ph);
97 }
98
99 /* content */
100 var content = document.createElement('div');
101 content.className = 'bkbg-rdc-content';
102
103 /* badge row */
104 var bRow = document.createElement('div');
105 bRow.className = 'bkbg-rdc-badge-row';
106 var b = document.createElement('span');
107 b.className = 'bkbg-rdc-badge';
108 b.style.cssText = 'background:' + badgeBg + ';color:' + badgeColor;
109 b.textContent = badge.toUpperCase();
110 bRow.appendChild(b);
111 if (layout !== 'minimal') {
112 var ico = document.createElement('span');
113 ico.className = 'bkbg-rdc-type-icon';
114 ico.textContent = TYPE_ICONS[contentType] || '📚';
115 bRow.appendChild(ico);
116 }
117 content.appendChild(bRow);
118
119 /* title */
120 var t = document.createElement('h3');
121 t.className = 'bkbg-rdc-title';
122 if (titleColor) t.style.color = titleColor;
123 t.textContent = title;
124 content.appendChild(t);
125
126 /* author */
127 var a = document.createElement('p');
128 a.className = 'bkbg-rdc-author';
129 if (authorColor) a.style.color = authorColor;
130 a.textContent = author;
131 content.appendChild(a);
132
133 /* rating */
134 if (showRating && rating > 0 && layout !== 'minimal') {
135 var rRow = document.createElement('div');
136 rRow.className = 'bkbg-rdc-rating';
137 for (var s = 0; s < 5; s++) {
138 var star = document.createElement('span');
139 star.className = 'bkbg-rdc-star';
140 star.style.color = s < rating ? ratingColor : '#d1d5db';
141 star.textContent = '�
142 ';
143 rRow.appendChild(star);
144 }
145 content.appendChild(rRow);
146 }
147
148 /* description */
149 if (description && layout !== 'minimal') {
150 var d = document.createElement('p');
151 d.className = 'bkbg-rdc-desc';
152 if (descColor) d.style.color = descColor;
153 d.textContent = description;
154 content.appendChild(d);
155 }
156
157 /* cta */
158 var cta = document.createElement('a');
159 cta.className = 'bkbg-rdc-cta';
160 cta.href = ctaUrl;
161 cta.style.color = ctaColor;
162 if (ctaIsExternal) { cta.target = '_blank'; cta.rel = 'noopener noreferrer'; }
163 cta.textContent = ctaLabel;
164 content.appendChild(cta);
165
166 card.appendChild(content);
167 wrap.appendChild(card);
168 app.replaceWith(wrap);
169 });
170 })();
171