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 / tech-radar / frontend.js

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

137 lines 6.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 function mk(tag, cls, styles) { var d = document.createElement(tag); if (cls) d.className = cls; if (styles) Object.keys(styles).forEach(function (k) { d.style[k] = styles[k]; }); return d; }
4 function tx(tag, cls, text, styles) { var d = mk(tag, cls, styles); d.textContent = text; return d; }
5 function ap(p) { Array.prototype.slice.call(arguments, 1).forEach(function (c) { if (c) p.appendChild(c); }); return p; }
6
7 var ringOrder = ['adopt', 'trial', 'assess', 'hold'];
8 var quadrantOptions = ['Languages & Frameworks', 'Platforms', 'Tools', 'Techniques'];
9
10 function ringInfo(r, a) {
11 var map = {
12 adopt: { label: 'Adopt', bg: a.adoptBg, color: a.adoptColor, border: a.adoptBorder },
13 trial: { label: 'Trial', bg: a.trialBg, color: a.trialColor, border: a.trialBorder },
14 assess: { label: 'Assess', bg: a.assessBg, color: a.assessColor, border: a.assessBorder },
15 hold: { label: 'Hold', bg: a.holdBg, color: a.holdColor, border: a.holdBorder }
16 };
17 return map[r] || map.adopt;
18 }
19
20 function buildRingSection(ring, blips, a) {
21 var ri = ringInfo(ring, a);
22 var section = mk('div', 'bkbg-tr-ring-section');
23 section.style.cssText = 'border-left:4px solid ' + ri.border + ';background:' + a.bgColor + ';border-radius:8px;overflow:hidden';
24
25 var head = mk('div', 'bkbg-tr-ring-head');
26 head.style.background = ri.bg;
27 var label = tx('span', 'bkbg-tr-ring-label', ri.label.toUpperCase());
28 label.style.cssText = 'color:' + ri.color + ';font-size:' + a.ringLabelSize + 'px';
29 var count = tx('span', 'bkbg-tr-ring-count', blips.length + ' ' + (blips.length === 1 ? 'entry' : 'entries'));
30 count.style.color = ri.color;
31 ap(head, label, count);
32 ap(section, head);
33
34 var list = mk('div', 'bkbg-tr-blip-list');
35 blips.forEach(function (blip, i) {
36 var row = mk('div', 'bkbg-tr-blip');
37 if (i > 0) { row.style.borderTopColor = a.borderColor; row.style.borderTopWidth = '1px'; row.style.borderTopStyle = 'solid'; }
38 var top = mk('div', 'bkbg-tr-blip-top');
39 var name = tx('span', 'bkbg-tr-blip-name', blip.name);
40 name.style.cssText = 'color:' + a.blipNameColor + ';font-size:' + a.blipNameSize + 'px';
41 ap(top, name);
42 if (a.showIsNew && blip.isNew) {
43 var badge = tx('span', 'bkbg-tr-new-badge', 'NEW');
44 badge.style.cssText = 'background:' + a.newBadgeBg + ';color:' + a.newBadgeColor;
45 ap(top, badge);
46 }
47 ap(row, top);
48 if (blip.description) {
49 var desc = tx('div', 'bkbg-tr-blip-desc', blip.description);
50 desc.style.color = a.blipDescColor;
51 ap(row, desc);
52 }
53 ap(list, row);
54 });
55 ap(section, list);
56 return section;
57 }
58
59 function groupByRing(blips) {
60 var g = {};
61 ringOrder.forEach(function (r) { g[r] = []; });
62 blips.forEach(function (b) { if (g[b.ring]) g[b.ring].push(b); });
63 return g;
64 }
65
66 function buildBlock(appEl) {
67 if (appEl.dataset.rendered) return;
68 appEl.dataset.rendered = '1';
69
70 var a = Object.assign({
71 radarTitle: 'Technology Radar', description: '', showDescription: true,
72 groupByQuadrant: false, showIsNew: true, blips: [],
73 fontSize: 14, titleFontSize: 24, ringLabelSize: 11, blipNameSize: 14,
74 lineHeight: 160, borderRadius: 12,
75 bgColor: '#ffffff', borderColor: '#e5e7eb',
76 titleColor: '#111827', descColor: '#6b7280',
77 blipNameColor: '#1f2937', blipDescColor: '#6b7280',
78 quadrantHeadColor: '#374151', newBadgeBg: '#fef9c3', newBadgeColor: '#713f12',
79 adoptBg: '#dcfce7', adoptColor: '#14532d', adoptBorder: '#16a34a',
80 trialBg: '#dbeafe', trialColor: '#1e40af', trialBorder: '#2563eb',
81 assessBg: '#fef9c3', assessColor: '#713f12', assessBorder: '#d97706',
82 holdBg: '#f3f4f6', holdColor: '#374151', holdBorder: '#9ca3af'
83 }, JSON.parse(appEl.dataset.opts || '{}'));
84
85 var lh = (a.lineHeight / 100).toFixed(2);
86
87 var wrap = mk('div', 'bkbg-tr-wrap');
88 wrap.style.cssText = 'background:' + a.bgColor + ';border-radius:' + a.borderRadius + 'px;border:1px solid ' + a.borderColor + ';padding:32px;font-size:' + a.fontSize + 'px;line-height:' + lh;
89
90 var header = mk('div', 'bkbg-tr-header');
91 var title = tx('h2', 'bkbg-tr-title', a.radarTitle);
92 title.style.color = a.titleColor;
93 ap(header, title);
94 if (a.showDescription && a.description) {
95 var desc = tx('p', 'bkbg-tr-desc', a.description);
96 desc.style.color = a.descColor;
97 ap(header, desc);
98 }
99 ap(wrap, header);
100
101 if (a.groupByQuadrant) {
102 var quadGrid = mk('div', 'bkbg-tr-quadrants');
103 quadrantOptions.forEach(function (q) {
104 var qBlips = a.blips.filter(function (b) { return b.quadrant === q; });
105 if (!qBlips.length) return;
106 var qCard = mk('div', 'bkbg-tr-quadrant');
107 qCard.style.cssText = 'border:1px solid ' + a.borderColor + ';border-radius:8px;overflow:hidden';
108 var qHead = tx('div', 'bkbg-tr-quadrant-head', q);
109 qHead.style.cssText = 'color:' + a.quadrantHeadColor + ';border-bottom:1px solid ' + a.borderColor;
110 ap(qCard, qHead);
111 var qGrouped = groupByRing(qBlips);
112 var qRings = mk('div', 'bkbg-tr-rings');
113 qRings.style.display = 'flex'; qRings.style.flexDirection = 'column'; qRings.style.gap = '8px'; qRings.style.padding = '8px';
114 ringOrder.forEach(function (ring) {
115 if (qGrouped[ring] && qGrouped[ring].length) { ap(qRings, buildRingSection(ring, qGrouped[ring], a)); }
116 });
117 ap(qCard, qRings);
118 ap(quadGrid, qCard);
119 });
120 ap(wrap, quadGrid);
121 } else {
122 var rings = mk('div', 'bkbg-tr-rings');
123 var grouped = groupByRing(a.blips);
124 ringOrder.forEach(function (ring) {
125 if (grouped[ring] && grouped[ring].length) { ap(rings, buildRingSection(ring, grouped[ring], a)); }
126 });
127 ap(wrap, rings);
128 }
129
130 appEl.innerHTML = '';
131 appEl.appendChild(wrap);
132 }
133
134 function init() { document.querySelectorAll('.bkbg-tech-radar-app').forEach(buildBlock); }
135 if (document.readyState !== 'loading') { init(); } else { document.addEventListener('DOMContentLoaded', init); }
136 })();
137