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

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

214 lines 9.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function () {
2 function typoCssVarsForEl(typo, prefix, el) {
3 if (!typo || typeof typo !== 'object') return;
4 var m = { family:'font-family', weight:'font-weight', transform:'text-transform', style:'font-style', decoration:'text-decoration',
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 letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
8 wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m' };
9 Object.keys(m).forEach(function (k) {
10 if (typo[k] !== undefined && typo[k] !== '') {
11 var v = typo[k], u = typo[k + 'Unit'] || '';
12 if (/Desktop|Tablet|Mobile/.test(k) && typeof v === 'number') v = v + (u || 'px');
13 el.style.setProperty(prefix + m[k], '' + v);
14 }
15 });
16 }
17
18 function init() {
19 document.querySelectorAll('.bkbg-dfn-app').forEach(function (el) {
20 if (el.dataset.rendered) return;
21 el.dataset.rendered = '1';
22 var opts;
23 try { opts = JSON.parse(el.dataset.opts || '{}'); } catch (e) { opts = {}; }
24 var o = Object.assign({
25 term: 'Term',
26 pronunciation: '',
27 partOfSpeech: 'noun',
28 shortDef: '',
29 longDef: '',
30 etymology: '',
31 examples: [''],
32 synonyms: '',
33 antonyms: '',
34 sourceLabel: '',
35 sourceUrl: '',
36 style: 'card',
37 bgColor: '#ffffff',
38 borderColor: '#e2e8f0',
39 accentColor: '#7c3aed',
40 termColor: '#0f172a',
41 pronunciationColor: '#7c3aed',
42 posColor: '#7c3aed',
43 posBg: '#f5f3ff',
44 shortDefColor: '#1e293b',
45 longDefColor: '#475569',
46 exampleColor: '#475569',
47 labelColor: '#94a3b8',
48 synonymColor: '#7c3aed',
49 borderRadius: 10,
50 paddingTop: 0,
51 paddingBottom: 0,
52 showPronunciation: true,
53 showPartOfSpeech: true,
54 showLongDef: true,
55 showExamples: true,
56 showSynonyms: true,
57 showAntonyms: false,
58 showEtymology: false
59 }, opts);
60
61 function mk(tag, cls, style, text) {
62 var node = document.createElement(tag);
63 if (cls) node.className = cls;
64 if (style) Object.assign(node.style, style);
65 if (text != null) node.textContent = text;
66 return node;
67 }
68
69 function sectionLabel(txt) {
70 var d = mk('div', 'bkbg-dfn-section-label', { color: o.labelColor }, txt);
71 return d;
72 }
73
74 function tagChips(str, bg, color) {
75 var wrap = mk('div', 'bkbg-dfn-tags');
76 str.split(',').forEach(function (s) {
77 var t = s.trim();
78 if (!t) return;
79 var chip = mk('span', 'bkbg-dfn-tag', { background: bg, color: color }, t);
80 wrap.appendChild(chip);
81 });
82 return wrap;
83 }
84
85 /* wrap */
86 var isSpotlight = o.style === 'spotlight';
87 var wrap = mk('div', 'bkbg-dfn-wrap bkbg-dfn-style-' + o.style, {
88 background: o.bgColor,
89 borderRadius: o.borderRadius + 'px'
90 });
91
92 /* Typography CSS vars */
93 wrap.style.setProperty('--bkbg-dfn-trm-fs', (o.termFontSize || 24) + 'px');
94 wrap.style.setProperty('--bkbg-dfn-sd-fs', (o.shortDefFontSize || 16) + 'px');
95 wrap.style.setProperty('--bkbg-dfn-ld-fs', (o.longDefFontSize || 14) + 'px');
96 if (o.typoTerm) typoCssVarsForEl(o.typoTerm, '--bkbg-dfn-trm-', wrap);
97 if (o.typoShortDef) typoCssVarsForEl(o.typoShortDef, '--bkbg-dfn-sd-', wrap);
98 if (o.typoLongDef) typoCssVarsForEl(o.typoLongDef, '--bkbg-dfn-ld-', wrap);
99 if (o.style === 'card') { wrap.style.border = '1px solid ' + o.borderColor; wrap.style.padding = '20px 22px'; }
100 if (o.style === 'classic') { wrap.style.borderLeft = '5px solid ' + o.accentColor; wrap.style.padding = '16px 20px'; }
101 if (o.style === 'minimal') { wrap.style.padding = '8px 0'; }
102 if (o.style === 'spotlight') { wrap.style.border = '1px solid ' + o.borderColor; wrap.style.overflow = 'hidden'; }
103
104 /* header */
105 var header = mk('div', 'bkbg-dfn-header');
106 if (isSpotlight) { header.style.background = o.accentColor; header.style.padding = '14px 22px'; }
107
108 var headerRow = mk('div', 'bkbg-dfn-header-row');
109
110 var termEl = mk('span', 'bkbg-dfn-term', {
111 color: isSpotlight ? '#fff' : o.termColor
112 }, '');
113 termEl.innerHTML = o.term;
114 headerRow.appendChild(termEl);
115
116 if (o.showPronunciation && o.pronunciation) {
117 var pron = mk('span', 'bkbg-dfn-pronunciation', {
118 color: isSpotlight ? 'rgba(255,255,255,0.8)' : o.pronunciationColor
119 }, o.pronunciation);
120 headerRow.appendChild(pron);
121 }
122
123 if (o.showPartOfSpeech && o.partOfSpeech) {
124 var pos = mk('span', 'bkbg-dfn-pos', {
125 background: isSpotlight ? 'rgba(255,255,255,0.2)' : o.posBg,
126 color: isSpotlight ? '#fff' : o.posColor
127 }, o.partOfSpeech);
128 headerRow.appendChild(pos);
129 }
130
131 header.appendChild(headerRow);
132 wrap.appendChild(header);
133
134 /* body */
135 var body = mk('div', 'bkbg-dfn-body');
136 if (isSpotlight) { body.style.padding = '16px 22px'; }
137
138 /* short def */
139 if (o.shortDef) {
140 var sd = mk('p', 'bkbg-dfn-short-def', { color: o.shortDefColor }, '');
141 sd.innerHTML = o.shortDef;
142 body.appendChild(sd);
143 }
144
145 /* long def */
146 if (o.showLongDef && o.longDef) {
147 body.appendChild(sectionLabel('Explanation'));
148 var ld = mk('p', 'bkbg-dfn-long-def', { color: o.longDefColor }, '');
149 ld.innerHTML = o.longDef;
150 body.appendChild(ld);
151 }
152
153 /* examples */
154 if (o.showExamples && o.examples && o.examples.some(function (e) { return e && e.trim(); })) {
155 body.appendChild(sectionLabel('Examples'));
156 var ul = mk('ul', 'bkbg-dfn-examples');
157 o.examples.forEach(function (ex) {
158 if (!ex || !ex.trim()) return;
159 var li = mk('li', 'bkbg-dfn-example', { color: o.exampleColor });
160 li.style.setProperty('--accent', o.accentColor);
161 li.textContent = ex.trim();
162 ul.appendChild(li);
163 });
164 body.appendChild(ul);
165 }
166
167 /* synonyms */
168 if (o.showSynonyms && o.synonyms && o.synonyms.trim()) {
169 body.appendChild(sectionLabel('Synonyms'));
170 body.appendChild(tagChips(o.synonyms, o.synonymColor + '20', o.synonymColor));
171 }
172
173 /* antonyms */
174 if (o.showAntonyms && o.antonyms && o.antonyms.trim()) {
175 body.appendChild(sectionLabel('Antonyms'));
176 body.appendChild(tagChips(o.antonyms, '#dc262620', '#dc2626'));
177 }
178
179 /* etymology */
180 if (o.showEtymology && o.etymology && o.etymology.trim()) {
181 body.appendChild(sectionLabel('Etymology'));
182 var ety = mk('p', 'bkbg-dfn-etymology', { color: o.longDefColor }, '');
183 ety.innerHTML = o.etymology;
184 body.appendChild(ety);
185 }
186
187 /* source */
188 if (o.sourceLabel || o.sourceUrl) {
189 var src = mk('div', 'bkbg-dfn-source', { color: o.labelColor, borderTop: '1px solid ' + o.borderColor });
190 if (o.sourceUrl) {
191 var a = document.createElement('a');
192 a.href = o.sourceUrl;
193 a.target = '_blank';
194 a.rel = 'noopener noreferrer';
195 a.textContent = o.sourceLabel || o.sourceUrl;
196 a.style.color = o.accentColor;
197 src.textContent = '— Source: ';
198 src.appendChild(a);
199 } else {
200 src.textContent = '— Source: ' + o.sourceLabel;
201 }
202 body.appendChild(src);
203 }
204
205 wrap.appendChild(body);
206
207 el.parentNode.insertBefore(wrap, el);
208 });
209 }
210
211 if (document.readyState !== 'loading') { init(); }
212 else { document.addEventListener('DOMContentLoaded', init); }
213 })();
214