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

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

248 lines 10.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 var _typoKeys = [['family','font-family'],['weight','font-weight'],['style','font-style'],['decoration','text-decoration'],['transform','text-transform']];
5 var _sizeKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
6 var _lhKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
7 var _lsKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
8 var _wsKeys = [['Desktop','d'],['Tablet','t'],['Mobile','m']];
9
10 function typoCssVarsForEl(el, obj, prefix) {
11 if (!obj || typeof obj !== 'object') return;
12 _typoKeys.forEach(function (p) { if (obj[p[0]]) el.style.setProperty(prefix + '-' + p[1], obj[p[0]]); });
13 var u = obj.sizeUnit || 'px';
14 _sizeKeys.forEach(function (p) { var v = obj['size' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-font-size-' + p[1], v + u); });
15 _lhKeys.forEach(function (p) { var v = obj['lineHeight' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-line-height-' + p[1], String(v)); });
16 _lsKeys.forEach(function (p) { var v = obj['letterSpacing' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-letter-spacing-' + p[1], v + 'px'); });
17 _wsKeys.forEach(function (p) { var v = obj['wordSpacing' + p[0]]; if (v !== undefined && v !== '') el.style.setProperty(prefix + '-word-spacing-' + p[1], v + 'px'); });
18 }
19
20 function mk(tag, cls, styles) {
21 var d = document.createElement(tag);
22 if (cls) d.className = cls;
23 if (styles) Object.keys(styles).forEach(function (k) { d.style[k] = styles[k]; });
24 return d;
25 }
26 function tx(tag, cls, text, styles) {
27 var d = mk(tag, cls, styles);
28 d.textContent = text;
29 return d;
30 }
31 function ap(parent) {
32 Array.prototype.slice.call(arguments, 1).forEach(function (c) { if (c) parent.appendChild(c); });
33 return parent;
34 }
35
36 var moodEmoji = { great: '🚀', good: '😊', okay: '😐', tough: '😓' };
37 var moodLabel = { great: 'Great', good: 'Good', okay: 'Okay', tough: 'Tough' };
38 var moodStyles = {
39 great: { bg: '#dcfce7', color: '#14532d' },
40 good: { bg: '#dbeafe', color: '#1e40af' },
41 okay: { bg: '#fef9c3', color: '#713f12' },
42 tough: { bg: '#fee2e2', color: '#991b1b' }
43 };
44
45 function prioBadge(p, a) {
46 if (p === 'high') return { label: '🔴 High', bg: a.highBg, color: a.highColor };
47 if (p === 'medium') return { label: '🟡 Med', bg: a.medBg, color: a.medColor };
48 return { label: '🟢 Low', bg: a.lowBg, color: a.lowColor };
49 }
50
51 function buildBlock(appEl) {
52 if (appEl.dataset.rendered) return;
53 appEl.dataset.rendered = '1';
54
55 var a = Object.assign({
56 sprintNumber: 'Sprint', sprintGoal: '', startDate: '', endDate: '',
57 velocityPlanned: 40, velocityActual: 34, showVelocity: true,
58 mood: 'good', showMood: true,
59 teamMembers: [], showTeam: true,
60 wentWell: [], wentWellLabel: '�
61 Went Well',
62 toImprove: [], toImproveLabel: '🔧 To Improve',
63 actionItems: [], actionItemsLabel: '⚡ Action Items',
64 fontSize: 14, titleFontSize: 22, lineHeight: 168, borderRadius: 12,
65 bgColor: '#ffffff', borderColor: '#e5e7eb',
66 headerBg: '#1e293b', headerColor: '#f8fafc',
67 accentColor: '#6366f1', metaColor: '#94a3b8',
68 velocityFillColor: '#6366f1', velocityBgColor: '#e2e8f0',
69 wellBg: '#f0fdf4', wellBorder: '#16a34a', wellColor: '#166534', wellHeadBg: '#dcfce7',
70 improveBg: '#fffbeb', improveBorder: '#d97706', improveColor: '#78350f', improveHeadBg: '#fef3c7',
71 actionBg: '#f5f3ff', actionBorder: '#7c3aed', actionColor: '#4c1d95', actionHeadBg: '#ede9fe',
72 highBg: '#fee2e2', highColor: '#991b1b',
73 medBg: '#fef3c7', medColor: '#78350f',
74 lowBg: '#dcfce7', lowColor: '#14532d',
75 teamBg: '#f1f5f9', teamColor: '#334155'
76 }, JSON.parse(appEl.dataset.opts || '{}'));
77
78 var lh = (a.lineHeight / 100).toFixed(2);
79 var velPct = a.velocityPlanned > 0 ? Math.min(100, Math.round((a.velocityActual / a.velocityPlanned) * 100)) : 0;
80 var ms = moodStyles[a.mood] || moodStyles.good;
81
82 var wrap = mk('div', 'bkbg-spr-wrap');
83 wrap.style.border = '1px solid ' + a.borderColor;
84 wrap.style.borderRadius = a.borderRadius + 'px';
85 wrap.style.overflow = 'hidden';
86 wrap.style.background = a.bgColor;
87
88 /* Legacy + typo CSS vars */
89 wrap.style.setProperty('--bkspr-tt-sz', (a.titleFontSize || 22) + 'px');
90 wrap.style.setProperty('--bkspr-bd-sz', (a.fontSize || 14) + 'px');
91 wrap.style.setProperty('--bkspr-bd-w', String(a.fontWeight || '400'));
92 wrap.style.setProperty('--bkspr-bd-lh', lh);
93 typoCssVarsForEl(wrap, a.titleTypo, '--bkspr-tt');
94 typoCssVarsForEl(wrap, a.bodyTypo, '--bkspr-bd');
95
96 // ---- Header ----
97 var header = mk('div', 'bkbg-spr-header');
98 header.style.background = a.headerBg;
99
100 var headerTop = mk('div', 'bkbg-spr-header-top');
101
102 // Left: title, goal, dates
103 var hLeft = mk('div');
104 var titleEl = tx('h2', 'bkbg-spr-title', a.sprintNumber);
105 titleEl.style.color = a.headerColor;
106 ap(hLeft, titleEl);
107 if (a.sprintGoal) {
108 var goalEl = tx('div', 'bkbg-spr-goal', '🎯 ' + a.sprintGoal);
109 goalEl.style.color = a.metaColor;
110 ap(hLeft, goalEl);
111 }
112 if (a.startDate || a.endDate) {
113 var datesText = [a.startDate, a.endDate].filter(Boolean).join('');
114 var datesEl = tx('div', 'bkbg-spr-dates', datesText);
115 datesEl.style.color = a.metaColor;
116 ap(hLeft, datesEl);
117 }
118 ap(headerTop, hLeft);
119
120 // Right: mood badge
121 if (a.showMood) {
122 var moodEl = mk('div', 'bkbg-spr-mood');
123 moodEl.style.background = ms.bg;
124 moodEl.style.color = ms.color;
125 var moodEmojiEl = tx('div', 'bkbg-spr-mood-emoji', moodEmoji[a.mood] || '😊');
126 var moodTextEl = tx('div', '', 'Team Mood: ' + (moodLabel[a.mood] || a.mood));
127 ap(moodEl, moodEmojiEl, moodTextEl);
128 ap(headerTop, moodEl);
129 }
130 ap(header, headerTop);
131
132 // Velocity bar
133 if (a.showVelocity) {
134 var velWrap = mk('div', 'bkbg-spr-velocity');
135 var velLabel = mk('div', 'bkbg-spr-vel-label');
136 var velLeft = tx('span', '', 'Velocity: ' + a.velocityActual + ' / ' + a.velocityPlanned + ' pts');
137 velLeft.style.color = a.metaColor;
138 var velRight = tx('span', '', velPct + '%');
139 velRight.style.color = a.metaColor;
140 ap(velLabel, velLeft, velRight);
141
142 var velTrack = mk('div', 'bkbg-spr-vel-track');
143 velTrack.style.background = a.velocityBgColor;
144 var velFill = mk('div', 'bkbg-spr-vel-fill');
145 velFill.style.width = velPct + '%';
146 velFill.style.background = a.velocityFillColor;
147 ap(velTrack, velFill);
148 ap(velWrap, velLabel, velTrack);
149 ap(header, velWrap);
150 }
151 ap(wrap, header);
152
153 // ---- 3-column board ----
154 var board = mk('div', 'bkbg-spr-board');
155 board.style.borderTop = '1px solid ' + a.borderColor;
156
157 // Helper to make a column
158 function makeCol(label, headBg, borderColor, bodyBg, content) {
159 var col = mk('div', 'bkbg-spr-col');
160 col.style.borderColor = a.borderColor;
161
162 var head = tx('div', 'bkbg-spr-col-head', label);
163 head.style.background = headBg;
164 head.style.borderBottomColor = borderColor;
165 ap(col, head, content);
166 return col;
167 }
168
169 // Went Well
170 var wwList = mk('ul', 'bkbg-spr-col-list');
171 wwList.style.background = a.wellBg;
172 wwList.style.color = a.wellColor;
173 a.wentWell.forEach(function (w) {
174 var li = tx('li', '', w);
175 li.style.lineHeight = lh;
176 ap(wwList, li);
177 });
178 ap(board, makeCol(a.wentWellLabel, a.wellHeadBg, a.wellBorder, a.wellBg, wwList));
179
180 // To Improve
181 var tiList = mk('ul', 'bkbg-spr-col-list');
182 tiList.style.background = a.improveBg;
183 tiList.style.color = a.improveColor;
184 a.toImprove.forEach(function (t) {
185 var li = tx('li', '', t);
186 li.style.lineHeight = lh;
187 ap(tiList, li);
188 });
189 ap(board, makeCol(a.toImproveLabel, a.improveHeadBg, a.improveBorder, a.improveBg, tiList));
190
191 // Action Items
192 var actBody = mk('div', 'bkbg-spr-col-body');
193 actBody.style.background = a.actionBg;
194 a.actionItems.forEach(function (act, i) {
195 var pb = prioBadge(act.priority, a);
196 var card = mk('div', 'bkbg-spr-action');
197 if (i < a.actionItems.length - 1) {
198 card.style.borderBottom = '1px dashed ' + a.borderColor;
199 }
200 var badge = tx('span', 'bkbg-spr-prio-badge', pb.label);
201 badge.style.background = pb.bg;
202 badge.style.color = pb.color;
203
204 var taskEl = tx('div', 'bkbg-spr-action-task', act.task);
205 taskEl.style.color = a.actionColor;
206 taskEl.style.fontSize = a.fontSize + 'px';
207 taskEl.style.lineHeight = lh;
208
209 ap(card, badge, taskEl);
210 if (act.owner) {
211 var ownerEl = tx('div', 'bkbg-spr-action-owner', '' + act.owner);
212 ownerEl.style.color = a.metaColor;
213 ap(card, ownerEl);
214 }
215 ap(actBody, card);
216 });
217 ap(board, makeCol(a.actionItemsLabel, a.actionHeadBg, a.actionBorder, a.actionBg, actBody));
218
219 ap(wrap, board);
220
221 // ---- Team footer ----
222 if (a.showTeam && a.teamMembers.length > 0) {
223 var footer = mk('div', 'bkbg-spr-footer');
224 footer.style.borderTop = '1px solid ' + a.borderColor;
225 var footLabel = tx('span', 'bkbg-spr-footer-label', 'Team:');
226 footLabel.style.color = a.metaColor;
227 ap(footer, footLabel);
228 a.teamMembers.forEach(function (m) {
229 var pill = tx('span', 'bkbg-spr-member', m);
230 pill.style.background = a.teamBg;
231 pill.style.color = a.teamColor;
232 ap(footer, pill);
233 });
234 ap(wrap, footer);
235 }
236
237 appEl.innerHTML = '';
238 appEl.appendChild(wrap);
239 }
240
241 function init() {
242 document.querySelectorAll('.bkbg-sprint-retrospective-app').forEach(buildBlock);
243 }
244
245 if (document.readyState !== 'loading') { init(); }
246 else { document.addEventListener('DOMContentLoaded', init); }
247 })();
248