PluginProbe
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor / 2.0.13
Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor v2.0.13
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 / study-notes / frontend.js

frontend.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.13, at blocks/study-notes/frontend.js

218 lines 9.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 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
20 var _typoKeys = {
21 family: 'font-family', sizeDesktop: 'font-size-d', sizeTablet: 'font-size-t',
22 sizeMobile: 'font-size-m', lineHeightDesktop: 'line-height-d', lineHeightTablet: 'line-height-t',
23 lineHeightMobile: 'line-height-m', letterSpacingDesktop: 'letter-spacing-d',
24 letterSpacingTablet: 'letter-spacing-t', letterSpacingMobile: 'letter-spacing-m',
25 wordSpacingDesktop: 'word-spacing-d', wordSpacingTablet: 'word-spacing-t',
26 wordSpacingMobile: 'word-spacing-m', weight: 'font-weight', style: 'font-style',
27 decoration: 'text-decoration', transform: 'text-transform'
28 };
29 function typoCssVarsForEl(el, obj, prefix) {
30 if (!obj || typeof obj !== 'object') return;
31 Object.keys(obj).forEach(function (k) {
32 var css = _typoKeys[k]; if (!css) return;
33 var v = obj[k]; if (v === '' || v === undefined || v === null) return;
34 el.style.setProperty(prefix + css, String(v));
35 });
36 }
37
38 function init() {
39 document.querySelectorAll('.bkbg-study-notes-app').forEach(function (appEl) {
40 if (appEl.dataset.rendered) return;
41 appEl.dataset.rendered = '1';
42
43 var opts;
44 try { opts = JSON.parse(appEl.dataset.opts || '{}'); } catch (e) { opts = {}; }
45
46 var o = Object.assign({
47 subject: 'Subject',
48 topic: 'Topic',
49 source: '',
50 noteDate: '',
51 showSubject: true,
52 showSource: true,
53 showDate: true,
54 layout: 'cornell',
55 cueWidth: 30,
56 notes: [],
57 summary: '',
58 showSummary: true,
59 summaryLabel: 'Summary',
60 keyTerms: [],
61 showKeyTerms: true,
62 keyTermsLabel: 'Key Terms',
63 tags: [],
64 showTags: true,
65 fontSize: 14,
66 titleFontSize: 20,
67 lineHeight: 170,
68 borderRadius: 10,
69 bgColor: '#ffffff',
70 borderColor: '#d1d5db',
71 headerBg: '#1e3a5f',
72 headerColor: '#ffffff',
73 cueBg: '#f8fafc',
74 cueColor: '#1e40af',
75 cueBorderColor: '#e2e8f0',
76 notesBg: '#ffffff',
77 notesColor: '#374151',
78 rowBorderColor: '#e5e7eb',
79 summaryBg: '#fefce8',
80 summaryColor: '#1c1917',
81 summaryBorderColor: '#fde68a',
82 keyTermsBg: '#f0f9ff',
83 keyTermsColor: '#0f172a',
84 keyTermsBorderColor: '#bae6fd',
85 termColor: '#0369a1',
86 tagBg: '#e0e7ff',
87 tagColor: '#3730a3',
88 accentColor: '#3b82f6'
89 }, opts);
90
91 var br = (o.borderRadius || 10) + 'px';
92 var fs = (o.fontSize || 14) + 'px';
93 var lh = ((o.lineHeight || 170) / 100).toFixed(2);
94
95 var block = mk('div', 'bkbg-sn-block', {
96 background: o.bgColor,
97 border: '1px solid ' + o.borderColor,
98 borderRadius: br,
99 overflow: 'hidden'
100 });
101 block.style.setProperty('--bkbg-sn-row-border', o.rowBorderColor || '#e5e7eb');
102 block.style.setProperty('--bkbg-sn-cue-border', o.cueBorderColor || '#e2e8f0');
103 block.style.setProperty('--bkbg-sn-lh', lh);
104 typoCssVarsForEl(block, o.titleTypo, '--bksn-tt-');
105 typoCssVarsForEl(block, o.textTypo, '--bksn-tx-');
106
107 // ── Header ─────────────────────────────────────────────
108 var header = mk('div', 'bkbg-sn-header', {
109 background: o.headerBg,
110 color: o.headerColor,
111 borderRadius: br.replace('px', '') === '0' ? '0' : (o.borderRadius) + 'px ' + (o.borderRadius) + 'px 0 0'
112 });
113
114 var topRow = mk('div', null, { display: 'flex', alignItems: 'baseline', flexWrap: 'wrap', gap: '10px' });
115 var topicEl = tx('h3', 'bkbg-sn-topic', o.topic, { margin: '0', color: o.headerColor });
116 ap(topRow, topicEl);
117 if (o.showSubject && o.subject) {
118 ap(topRow, tx('span', 'bkbg-sn-subject-badge', o.subject));
119 }
120
121 var meta = mk('div', 'bkbg-sn-meta');
122 if (o.showSource && o.source) ap(meta, tx('span', null, '📖 ' + o.source));
123 if (o.showDate && o.noteDate) ap(meta, tx('span', null, '�
124 ' + o.noteDate));
125
126 ap(header, topRow, meta);
127 ap(block, header);
128
129 // ── Column stripe (cornell only) ───────────────────────
130 if (o.layout === 'cornell') {
131 var stripe = mk('div', 'bkbg-sn-col-stripe', { background: o.accentColor });
132 var cueS = mk('div', 'bkbg-sn-col-stripe-cue', { width: (o.cueWidth || 30) + '%' });
133 cueS.textContent = 'Cues / Questions';
134 var notesS = mk('div', 'bkbg-sn-col-stripe-notes');
135 notesS.textContent = 'Notes';
136 ap(stripe, cueS, notesS);
137 ap(block, stripe);
138 }
139
140 // ── Notes rows ────────────────────────────────────────
141 var layoutClass = 'bkbg-sn-notes' +
142 (o.layout === 'linear' ? ' is-linear' : '') +
143 (o.layout === 'cards' ? ' is-cards' : '');
144 var notesWrap = mk('div', layoutClass, { background: o.layout === 'cards' ? 'transparent' : o.notesBg, border: o.layout === 'cards' ? 'none' : '1px solid ' + o.borderColor, borderTop: 'none' });
145
146 (o.notes || []).forEach(function (note) {
147 var row = mk('div', 'bkbg-sn-row');
148 var cueDiv = mk('div', 'bkbg-sn-cue', { width: (o.cueWidth || 30) + '%', background: o.cueBg, color: o.cueColor });
149 cueDiv.textContent = note.cue || '';
150
151 var noteDiv = mk('div', 'bkbg-sn-note-text', { color: o.notesColor, background: o.notesBg });
152 noteDiv.textContent = note.content || '';
153
154 ap(row, cueDiv, noteDiv);
155 ap(notesWrap, row);
156 });
157
158 ap(block, notesWrap);
159
160 // ── Summary ────────────────────────────────────────────
161 if (o.showSummary && o.summary) {
162 var sumSec = mk('div', 'bkbg-sn-summary-section', {
163 background: o.summaryBg,
164 color: o.summaryColor,
165 borderColor: o.summaryBorderColor,
166 margin: '14px 14px 0'
167 });
168 ap(sumSec,
169 tx('span', 'bkbg-sn-section-label', o.summaryLabel || 'Summary', { color: o.summaryColor }),
170 tx('p', 'bkbg-sn-summary-text', o.summary)
171 );
172 ap(block, sumSec);
173 }
174
175 // ── Key Terms ─────────────────────────────────────────
176 if (o.showKeyTerms && o.keyTerms && o.keyTerms.length) {
177 var termSec = mk('div', 'bkbg-sn-terms-section', {
178 background: o.keyTermsBg,
179 color: o.keyTermsColor,
180 borderColor: o.keyTermsBorderColor,
181 margin: '12px 14px 0'
182 });
183 ap(termSec, tx('span', 'bkbg-sn-section-label', o.keyTermsLabel || 'Key Terms', { color: o.keyTermsColor }));
184
185 var ul = mk('ul', 'bkbg-sn-terms-list');
186 o.keyTerms.forEach(function (t) {
187 var li = mk('li', 'bkbg-sn-term-item');
188 ap(li,
189 tx('span', 'bkbg-sn-term-word', t.term, { color: o.termColor }),
190 tx('span', 'bkbg-sn-term-def', t.definition, { color: o.keyTermsColor })
191 );
192 ap(ul, li);
193 });
194 ap(termSec, ul);
195 ap(block, termSec);
196 }
197
198 // ── Tags ──────────────────────────────────────────────
199 if (o.showTags && o.tags && o.tags.length) {
200 var tagsWrap = mk('div', 'bkbg-sn-tags', { padding: '0 14px 14px', marginTop: '12px' });
201 o.tags.forEach(function (tag) {
202 if (!tag) return;
203 ap(tagsWrap, tx('span', 'bkbg-sn-tag', tag, { background: o.tagBg, color: o.tagColor }));
204 });
205 ap(block, tagsWrap);
206 } else {
207 block.style.paddingBottom = '4px';
208 }
209
210 appEl.parentNode.insertBefore(block, appEl);
211 appEl.style.display = 'none';
212 });
213 }
214
215 if (document.readyState !== 'loading') { init(); }
216 else { document.addEventListener('DOMContentLoaded', init); }
217 })();
218