# blockenberg/2.0.7/blocks/project-brief/frontend.js

Blockenberg — 600+ Advanced Gutenberg Blocks &amp; AI Agent for WordPress Block Editor, version 2.0.7. 245 lines.

- Page: https://pluginprobe.com/plugins/blockenberg/2.0.7/code/blocks/project-brief/frontend.js
- Raw: https://pluginprobe.com/plugins/blockenberg/2.0.7/raw/blocks/project-brief/frontend.js
- Modified: 2026-03-06T12:32:40+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/blockenberg/2.0.7/code/blocks/project-brief/frontend.js#L10-L20`.

```javascript
(function () {
    'use strict';

    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;
    }
    function tx(tag, cls, text, styles) {
        var d = mk(tag, cls, styles);
        d.textContent = text;
        return d;
    }
    function ap(parent) {
        Array.prototype.slice.call(arguments, 1).forEach(function (c) { if (c) parent.appendChild(c); });
        return parent;
    }

    function statusInfo(s) {
        var map = {
            'planning': { label: '📋 Planning',  bg: '#dbeafe', color: '#1e3a8a' },
            'active':   { label: '🚀 Active',    bg: '#dcfce7', color: '#14532d' },
            'review':   { label: '🔍 In Review', bg: '#fef9c3', color: '#713f12' },
            'complete': { label: '✅ Complete',  bg: '#e0e7ff', color: '#3730a3' },
            'on-hold':  { label: '⏸ On Hold',   bg: '#fee2e2', color: '#991b1b' }
        };
        return map[s] || map['planning'];
    }

    function riskColor(level) {
        if (level === 'high')   return { bg: '#fef2f2', color: '#991b1b', dot: '#ef4444' };
        if (level === 'medium') return { bg: '#fffbeb', color: '#92400e', dot: '#f59e0b' };
        return                         { bg: '#f0fdf4', color: '#14532d', dot: '#22c55e' };
    }

    function sectionHead(label, accentColor) {
        var h = tx('div', 'bkbg-pb-section-head', label);
        h.style.color = accentColor;
        h.style.borderBottomColor = accentColor;
        return h;
    }

    var _typoKeys = {
        family:'font-family', weight:'font-weight', style:'font-style',
        decoration:'text-decoration', transform:'text-transform',
        sizeDesktop:'font-size-d', sizeTablet:'font-size-t', sizeMobile:'font-size-m',
        lineHeightDesktop:'line-height-d', lineHeightTablet:'line-height-t', lineHeightMobile:'line-height-m',
        letterSpacingDesktop:'letter-spacing-d', letterSpacingTablet:'letter-spacing-t', letterSpacingMobile:'letter-spacing-m',
        wordSpacingDesktop:'word-spacing-d', wordSpacingTablet:'word-spacing-t', wordSpacingMobile:'word-spacing-m'
    };
    function typoCssVarsForEl(el, obj, prefix) {
        if (!obj || typeof obj !== 'object') return;
        Object.keys(_typoKeys).forEach(function (k) {
            var v = obj[k];
            if (v === undefined || v === '' || v === null) return;
            if (k === 'sizeDesktop' || k === 'sizeTablet' || k === 'sizeMobile') v = v + (obj.sizeUnit || 'px');
            else if (k === 'lineHeightDesktop' || k === 'lineHeightTablet' || k === 'lineHeightMobile') v = v + (obj.lineHeightUnit || '');
            else if (k === 'letterSpacingDesktop' || k === 'letterSpacingTablet' || k === 'letterSpacingMobile') v = v + (obj.letterSpacingUnit || 'px');
            else if (k === 'wordSpacingDesktop' || k === 'wordSpacingTablet' || k === 'wordSpacingMobile') v = v + (obj.wordSpacingUnit || 'px');
            el.style.setProperty(prefix + _typoKeys[k], String(v));
        });
    }

    function buildBlock(appEl) {
        if (appEl.dataset.rendered) return;
        appEl.dataset.rendered = '1';

        var a = Object.assign({
            projectName: '', projectType: '', status: 'active',
            client: '', owner: '', startDate: '', endDate: '',
            showDates: true, overview: '',
            goals: [], deliverables: [], stakeholders: [], risks: [],
            budget: '', showBudget: true, notes: '', showNotes: false,
            fontSize: 14, titleFontSize: 24, lineHeight: 168,
            titleTypo: {}, bodyTypo: {},
            borderRadius: 12,
            bgColor: '#ffffff', borderColor: '#e5e7eb', headerBg: '#0f172a',
            headerColor: '#ffffff', metaColor: '#94a3b8',
            sectionTitleColor: '#111827', bodyTextColor: '#374151',
            goalDotColor: '#3b82f6', delivDotColor: '#10b981',
            sectionBg: '#f8fafc', accentColor: '#3b82f6'
        }, JSON.parse(appEl.dataset.opts || '{}'));

        var si = statusInfo(a.status);

        var wrap = mk('div', 'bkbg-pb-wrap');
        wrap.style.border = '1px solid ' + a.borderColor;
        wrap.style.borderRadius = a.borderRadius + 'px';
        wrap.style.overflow = 'hidden';
        wrap.style.background = a.bgColor;
        typoCssVarsForEl(wrap, a.titleTypo, '--bkbg-pjb-tt-');
        typoCssVarsForEl(wrap, a.bodyTypo, '--bkbg-pjb-bd-');

        // ---- Header ----
        var header = mk('div', 'bkbg-pb-header');
        header.style.background = a.headerBg;

        var topRow = mk('div', 'bkbg-pb-header-top');
        var titleWrap = mk('div');
        var titleEl = tx('h2', 'bkbg-pb-title', a.projectName);
        titleEl.style.color = a.headerColor;
        var typeEl = tx('div', 'bkbg-pb-type', a.projectType);
        typeEl.style.color = a.metaColor;
        ap(titleWrap, titleEl, typeEl);

        var statusEl = tx('span', 'bkbg-pb-status', si.label);
        statusEl.style.background = si.bg;
        statusEl.style.color = si.color;
        ap(topRow, titleWrap, statusEl);

        var metaRow = mk('div', 'bkbg-pb-meta');
        var metaItems = [];
        if (a.owner) metaItems.push('👤 Owner: ' + a.owner);
        if (a.client) metaItems.push('🏢 Client: ' + a.client);
        if (a.showDates && a.startDate && a.endDate) metaItems.push('📅 ' + a.startDate + ' → ' + a.endDate);
        if (a.showBudget && a.budget) metaItems.push('💰 ' + a.budget);
        metaItems.forEach(function (m) {
            var s = tx('span', 'bkbg-pb-meta-item', m);
            s.style.color = a.metaColor;
            ap(metaRow, s);
        });

        ap(header, topRow, metaRow);
        ap(wrap, header);

        // ---- Body ----
        var body = mk('div', 'bkbg-pb-body');

        // Overview
        if (a.overview) {
            var ovSec = mk('div');
            ap(ovSec, sectionHead('Project Overview', a.accentColor));
            var ovText = tx('p', 'bkbg-pb-overview', a.overview);
            ovText.style.color = a.bodyTextColor;
            ap(ovSec, ovText);
            ap(body, ovSec);
        }

        // Goals + Deliverables
        function makeList(items, dotText, dotColor) {
            var ul = mk('ul', 'bkbg-pb-list');
            items.forEach(function (item) {
                var li = mk('li', 'bkbg-pb-list-item');
                var dot = tx('span', 'bkbg-pb-list-dot', dotText);
                dot.style.color = dotColor;
                var text = tx('span', '', item);
                text.style.color = a.bodyTextColor;
                ap(li, dot, text);
                ap(ul, li);
            });
            return ul;
        }

        if (a.goals.length > 0 || a.deliverables.length > 0) {
            var twoCol = mk('div', 'bkbg-pb-two-col');

            if (a.goals.length > 0) {
                var goalsCard = mk('div', 'bkbg-pb-card');
                goalsCard.style.background = a.sectionBg;
                ap(goalsCard, sectionHead('Goals', a.accentColor), makeList(a.goals, '✓', a.goalDotColor));
                ap(twoCol, goalsCard);
            }
            if (a.deliverables.length > 0) {
                var delivCard = mk('div', 'bkbg-pb-card');
                delivCard.style.background = a.sectionBg;
                ap(delivCard, sectionHead('Deliverables', a.accentColor), makeList(a.deliverables, '→', a.delivDotColor));
                ap(twoCol, delivCard);
            }
            ap(body, twoCol);
        }

        // Stakeholders
        if (a.stakeholders.length > 0) {
            var stSec = mk('div');
            ap(stSec, sectionHead('Stakeholders', a.accentColor));
            var stGrid = mk('div', 'bkbg-pb-stakeholders');
            a.stakeholders.forEach(function (s) {
                var card = mk('div', 'bkbg-pb-stakeholder');
                card.style.background = a.sectionBg;
                card.style.borderLeftColor = a.accentColor;
                var nameEl = tx('div', 'bkbg-pb-sh-name', s.name);
                nameEl.style.color = a.sectionTitleColor;
                var roleEl = tx('div', 'bkbg-pb-sh-role', s.role);
                roleEl.style.color = a.bodyTextColor;
                ap(card, nameEl, roleEl);
                ap(stGrid, card);
            });
            ap(stSec, stGrid);
            ap(body, stSec);
        }

        // Risks
        if (a.risks.length > 0) {
            var rkSec = mk('div');
            ap(rkSec, sectionHead('Risks', a.accentColor));
            var rkList = mk('div', 'bkbg-pb-risks');
            a.risks.forEach(function (r) {
                var lc = riskColor(r.likelihood);
                var ic = riskColor(r.impact);
                var row = mk('div', 'bkbg-pb-risk-row');
                row.style.background = a.sectionBg;
                row.style.borderLeftColor = lc.dot;

                var rText = tx('span', 'bkbg-pb-risk-text', r.risk);
                rText.style.color = a.bodyTextColor;

                var lBadge = tx('span', 'bkbg-pb-risk-badge', 'L: ' + r.likelihood);
                lBadge.style.background = lc.bg;
                lBadge.style.color = lc.color;

                var iBadge = tx('span', 'bkbg-pb-risk-badge', 'I: ' + r.impact);
                iBadge.style.background = ic.bg;
                iBadge.style.color = ic.color;

                ap(row, rText, lBadge, iBadge);
                ap(rkList, row);
            });
            ap(rkSec, rkList);
            ap(body, rkSec);
        }

        // Notes
        if (a.showNotes && a.notes) {
            var noteSec = mk('div');
            ap(noteSec, sectionHead('Additional Notes', a.accentColor));
            var noteText = tx('p', 'bkbg-pb-notes', a.notes);
            noteText.style.color = a.bodyTextColor;
            ap(noteSec, noteText);
            ap(body, noteSec);
        }

        ap(wrap, body);
        appEl.innerHTML = '';
        appEl.appendChild(wrap);
    }

    function init() {
        document.querySelectorAll('.bkbg-project-brief-app').forEach(buildBlock);
    }

    if (document.readyState !== 'loading') { init(); }
    else { document.addEventListener('DOMContentLoaded', init); }
})();

```
