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

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

247 lines 10.0 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 function statusInfo(s) {
21 var map = {
22 'planning': { label: '📋 Planning', bg: '#dbeafe', color: '#1e3a8a' },
23 'active': { label: '🚀 Active', bg: '#dcfce7', color: '#14532d' },
24 'review': { label: '🔍 In Review', bg: '#fef9c3', color: '#713f12' },
25 'complete': { label: '�
26 Complete', bg: '#e0e7ff', color: '#3730a3' },
27 'on-hold': { label: '⏸ On Hold', bg: '#fee2e2', color: '#991b1b' }
28 };
29 return map[s] || map['planning'];
30 }
31
32 function riskColor(level) {
33 if (level === 'high') return { bg: '#fef2f2', color: '#991b1b', dot: '#ef4444' };
34 if (level === 'medium') return { bg: '#fffbeb', color: '#92400e', dot: '#f59e0b' };
35 return { bg: '#f0fdf4', color: '#14532d', dot: '#22c55e' };
36 }
37
38 function sectionHead(label, accentColor) {
39 var h = tx('div', 'bkbg-pb-section-head', label);
40 h.style.color = accentColor;
41 h.style.borderBottomColor = accentColor;
42 return h;
43 }
44
45 var _typoKeys = {
46 family:'font-family', weight:'font-weight', style:'font-style',
47 decoration:'text-decoration', transform:'text-transform',
48 sizeDesktop:'font-size-d', sizeTablet:'font-size-t', sizeMobile:'font-size-m',
49 lineHeightDesktop:'line-height-d', lineHeightTablet:'line-height-t', lineHeightMobile:'line-height-m',
50 letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
51 wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m'
52 };
53 function typoCssVarsForEl(el, obj, prefix) {
54 if (!obj || typeof obj !== 'object') return;
55 Object.keys(_typoKeys).forEach(function (k) {
56 var v = obj[k];
57 if (v === undefined || v === '' || v === null) return;
58 if (k === 'sizeDesktop' || k === 'sizeTablet' || k === 'sizeMobile') v = v + (obj.sizeUnit || 'px');
59 else if (k === 'lineHeightDesktop' || k === 'lineHeightTablet' || k === 'lineHeightMobile') v = v + (obj.lineHeightUnit || '');
60 else if (k === 'letterSpacingDesktop' || k === 'letterSpacingTablet' || k === 'letterSpacingMobile') v = v + (obj.letterSpacingUnit || 'px');
61 else if (k === 'wordSpacingDesktop' || k === 'wordSpacingTablet' || k === 'wordSpacingMobile') v = v + (obj.wordSpacingUnit || 'px');
62 el.style.setProperty(prefix + _typoKeys[k], String(v));
63 });
64 }
65
66 function buildBlock(appEl) {
67 if (appEl.dataset.rendered) return;
68 appEl.dataset.rendered = '1';
69
70 var a = Object.assign({
71 projectName: '', projectType: '', status: 'active',
72 client: '', owner: '', startDate: '', endDate: '',
73 showDates: true, overview: '',
74 goals: [], deliverables: [], stakeholders: [], risks: [],
75 budget: '', showBudget: true, notes: '', showNotes: false,
76 fontSize: 14, titleFontSize: 24, lineHeight: 168,
77 titleTypo: {}, bodyTypo: {},
78 borderRadius: 12,
79 bgColor: '#ffffff', borderColor: '#e5e7eb', headerBg: '#0f172a',
80 headerColor: '#ffffff', metaColor: '#94a3b8',
81 sectionTitleColor: '#111827', bodyTextColor: '#374151',
82 goalDotColor: '#3b82f6', delivDotColor: '#10b981',
83 sectionBg: '#f8fafc', accentColor: '#3b82f6'
84 }, JSON.parse(appEl.dataset.opts || '{}'));
85
86 var si = statusInfo(a.status);
87
88 var wrap = mk('div', 'bkbg-pb-wrap');
89 wrap.style.border = '1px solid ' + a.borderColor;
90 wrap.style.borderRadius = a.borderRadius + 'px';
91 wrap.style.overflow = 'hidden';
92 wrap.style.background = a.bgColor;
93 typoCssVarsForEl(wrap, a.titleTypo, '--bkbg-pjb-tt-');
94 typoCssVarsForEl(wrap, a.bodyTypo, '--bkbg-pjb-bd-');
95
96 // ---- Header ----
97 var header = mk('div', 'bkbg-pb-header');
98 header.style.background = a.headerBg;
99
100 var topRow = mk('div', 'bkbg-pb-header-top');
101 var titleWrap = mk('div');
102 var titleEl = tx('h2', 'bkbg-pb-title', a.projectName);
103 titleEl.style.color = a.headerColor;
104 var typeEl = tx('div', 'bkbg-pb-type', a.projectType);
105 typeEl.style.color = a.metaColor;
106 ap(titleWrap, titleEl, typeEl);
107
108 var statusEl = tx('span', 'bkbg-pb-status', si.label);
109 statusEl.style.background = si.bg;
110 statusEl.style.color = si.color;
111 ap(topRow, titleWrap, statusEl);
112
113 var metaRow = mk('div', 'bkbg-pb-meta');
114 var metaItems = [];
115 if (a.owner) metaItems.push('👤 Owner: ' + a.owner);
116 if (a.client) metaItems.push('🏢 Client: ' + a.client);
117 if (a.showDates && a.startDate && a.endDate) metaItems.push('�
118 ' + a.startDate + '' + a.endDate);
119 if (a.showBudget && a.budget) metaItems.push('💰 ' + a.budget);
120 metaItems.forEach(function (m) {
121 var s = tx('span', 'bkbg-pb-meta-item', m);
122 s.style.color = a.metaColor;
123 ap(metaRow, s);
124 });
125
126 ap(header, topRow, metaRow);
127 ap(wrap, header);
128
129 // ---- Body ----
130 var body = mk('div', 'bkbg-pb-body');
131
132 // Overview
133 if (a.overview) {
134 var ovSec = mk('div');
135 ap(ovSec, sectionHead('Project Overview', a.accentColor));
136 var ovText = tx('p', 'bkbg-pb-overview', a.overview);
137 ovText.style.color = a.bodyTextColor;
138 ap(ovSec, ovText);
139 ap(body, ovSec);
140 }
141
142 // Goals + Deliverables
143 function makeList(items, dotText, dotColor) {
144 var ul = mk('ul', 'bkbg-pb-list');
145 items.forEach(function (item) {
146 var li = mk('li', 'bkbg-pb-list-item');
147 var dot = tx('span', 'bkbg-pb-list-dot', dotText);
148 dot.style.color = dotColor;
149 var text = tx('span', '', item);
150 text.style.color = a.bodyTextColor;
151 ap(li, dot, text);
152 ap(ul, li);
153 });
154 return ul;
155 }
156
157 if (a.goals.length > 0 || a.deliverables.length > 0) {
158 var twoCol = mk('div', 'bkbg-pb-two-col');
159
160 if (a.goals.length > 0) {
161 var goalsCard = mk('div', 'bkbg-pb-card');
162 goalsCard.style.background = a.sectionBg;
163 ap(goalsCard, sectionHead('Goals', a.accentColor), makeList(a.goals, '', a.goalDotColor));
164 ap(twoCol, goalsCard);
165 }
166 if (a.deliverables.length > 0) {
167 var delivCard = mk('div', 'bkbg-pb-card');
168 delivCard.style.background = a.sectionBg;
169 ap(delivCard, sectionHead('Deliverables', a.accentColor), makeList(a.deliverables, '', a.delivDotColor));
170 ap(twoCol, delivCard);
171 }
172 ap(body, twoCol);
173 }
174
175 // Stakeholders
176 if (a.stakeholders.length > 0) {
177 var stSec = mk('div');
178 ap(stSec, sectionHead('Stakeholders', a.accentColor));
179 var stGrid = mk('div', 'bkbg-pb-stakeholders');
180 a.stakeholders.forEach(function (s) {
181 var card = mk('div', 'bkbg-pb-stakeholder');
182 card.style.background = a.sectionBg;
183 card.style.borderLeftColor = a.accentColor;
184 var nameEl = tx('div', 'bkbg-pb-sh-name', s.name);
185 nameEl.style.color = a.sectionTitleColor;
186 var roleEl = tx('div', 'bkbg-pb-sh-role', s.role);
187 roleEl.style.color = a.bodyTextColor;
188 ap(card, nameEl, roleEl);
189 ap(stGrid, card);
190 });
191 ap(stSec, stGrid);
192 ap(body, stSec);
193 }
194
195 // Risks
196 if (a.risks.length > 0) {
197 var rkSec = mk('div');
198 ap(rkSec, sectionHead('Risks', a.accentColor));
199 var rkList = mk('div', 'bkbg-pb-risks');
200 a.risks.forEach(function (r) {
201 var lc = riskColor(r.likelihood);
202 var ic = riskColor(r.impact);
203 var row = mk('div', 'bkbg-pb-risk-row');
204 row.style.background = a.sectionBg;
205 row.style.borderLeftColor = lc.dot;
206
207 var rText = tx('span', 'bkbg-pb-risk-text', r.risk);
208 rText.style.color = a.bodyTextColor;
209
210 var lBadge = tx('span', 'bkbg-pb-risk-badge', 'L: ' + r.likelihood);
211 lBadge.style.background = lc.bg;
212 lBadge.style.color = lc.color;
213
214 var iBadge = tx('span', 'bkbg-pb-risk-badge', 'I: ' + r.impact);
215 iBadge.style.background = ic.bg;
216 iBadge.style.color = ic.color;
217
218 ap(row, rText, lBadge, iBadge);
219 ap(rkList, row);
220 });
221 ap(rkSec, rkList);
222 ap(body, rkSec);
223 }
224
225 // Notes
226 if (a.showNotes && a.notes) {
227 var noteSec = mk('div');
228 ap(noteSec, sectionHead('Additional Notes', a.accentColor));
229 var noteText = tx('p', 'bkbg-pb-notes', a.notes);
230 noteText.style.color = a.bodyTextColor;
231 ap(noteSec, noteText);
232 ap(body, noteSec);
233 }
234
235 ap(wrap, body);
236 appEl.innerHTML = '';
237 appEl.appendChild(wrap);
238 }
239
240 function init() {
241 document.querySelectorAll('.bkbg-project-brief-app').forEach(buildBlock);
242 }
243
244 if (document.readyState !== 'loading') { init(); }
245 else { document.addEventListener('DOMContentLoaded', init); }
246 })();
247