# blockenberg/2.0.13/blocks/release-notes/frontend.js

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

- Page: https://pluginprobe.com/plugins/blockenberg/2.0.13/code/blocks/release-notes/frontend.js
- Raw: https://pluginprobe.com/plugins/blockenberg/2.0.13/raw/blocks/release-notes/frontend.js
- Modified: 2026-09-12T16:20:02+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.13/code/blocks/release-notes/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 releaseTypeInfo(t) {
        if (t === 'major')  return { label: '🚀 Major',  bg: '#fee2e2', color: '#991b1b' };
        if (t === 'patch')  return { label: '🐛 Patch',  bg: '#fef9c3', color: '#713f12' };
        if (t === 'hotfix') return { label: '🔥 Hotfix', bg: '#ffedd5', color: '#9a3412' };
        return                     { label: '✨ Minor',  bg: '#dbeafe', color: '#1e3a8a' };
    }

    function sectionMeta(type, o) {
        if (type === 'added')      return { label: 'Added',      bg: o.addedBg,      color: o.addedColor,      dot: '#16a34a' };
        if (type === 'changed')    return { label: 'Changed',    bg: o.changedBg,    color: o.changedColor,    dot: '#2563eb' };
        if (type === 'fixed')      return { label: 'Fixed',      bg: o.fixedBg,      color: o.fixedColor,      dot: '#ca8a04' };
        if (type === 'removed')    return { label: 'Removed',    bg: o.removedBg,    color: o.removedColor,    dot: '#dc2626' };
        if (type === 'security')   return { label: 'Security',   bg: o.securityBg,   color: o.securityColor,   dot: '#7c3aed' };
        if (type === 'deprecated') return { label: 'Deprecated', bg: o.deprecatedBg, color: o.deprecatedColor, dot: '#64748b' };
        return { label: type, bg: '#f1f5f9', color: '#374151', dot: '#64748b' };
    }

    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(typo, prefix, el) {
        if (!typo || typeof typo !== 'object') return;
        Object.keys(_typoKeys).forEach(function(k) {
            if (typo[k] !== undefined && typo[k] !== '') {
                var v = typo[k];
                if (['sizeDesktop','sizeTablet','sizeMobile'].indexOf(k) !== -1) v = v + (typo.sizeUnit || 'px');
                else if (['lineHeightDesktop','lineHeightTablet','lineHeightMobile'].indexOf(k) !== -1) v = v + (typo.lineHeightUnit || '');
                else if (['letterSpacingDesktop','letterSpacingTablet','letterSpacingMobile'].indexOf(k) !== -1) v = v + (typo.letterSpacingUnit || 'px');
                else if (['wordSpacingDesktop','wordSpacingTablet','wordSpacingMobile'].indexOf(k) !== -1) v = v + (typo.wordSpacingUnit || 'px');
                el.style.setProperty(prefix + _typoKeys[k], String(v));
            }
        });
    }

    function init() {
        document.querySelectorAll('.bkbg-release-notes-app').forEach(function (appEl) {
            if (appEl.dataset.rendered) return;
            appEl.dataset.rendered = '1';

            var opts;
            try { opts = JSON.parse(appEl.dataset.opts || '{}'); } catch (e) { opts = {}; }

            var o = Object.assign({
                productName: 'Product', version: '1.0.0', releaseDate: '',
                releaseType: 'minor', showMeta: true, showReleaseType: true,
                intro: '', showIntro: true, sections: [],
                changelogUrl: '', compareUrl: '', showLinks: true,
                fontSize: 14, titleFontSize: 24, lineHeight: 168,
                borderRadius: 10, itemSpacing: 6,
                bgColor: '#ffffff', borderColor: '#e5e7eb',
                headerBg: '#0f172a', headerColor: '#ffffff',
                introBg: '#f8fafc', introColor: '#374151', textColor: '#374151',
                accentColor: '#3b82f6',
                addedBg: '#dcfce7', addedColor: '#14532d',
                changedBg: '#dbeafe', changedColor: '#1e3a8a',
                fixedBg: '#fef9c3', fixedColor: '#713f12',
                removedBg: '#fee2e2', removedColor: '#991b1b',
                securityBg: '#f3e8ff', securityColor: '#581c87',
                deprecatedBg: '#f1f5f9', deprecatedColor: '#475569'
            }, opts);

            // Block wrapper
            var block = mk('div', 'bkbg-rn-block', {
                border: '1px solid ' + o.borderColor,
                borderRadius: o.borderRadius + 'px',
                overflow: 'hidden',
                background: o.bgColor
            });
            typoCssVarsForEl(o.titleTypo, '--bkrn-tt-', block);
            typoCssVarsForEl(o.bodyTypo, '--bkrn-bt-', block);

            // ── Header ───────────────────────────────────────────
            var header = mk('div', 'bkbg-rn-header', { background: o.headerBg });
            var hrow   = mk('div', 'bkbg-rn-header-row');
            ap(hrow, tx('span', 'bkbg-rn-version', 'v' + o.version, { color: o.headerColor }));
            if (o.showReleaseType) {
                var rtI = releaseTypeInfo(o.releaseType);
                ap(hrow, tx('span', 'bkbg-rn-type-badge', rtI.label, { background: rtI.bg, color: rtI.color }));
            }
            ap(hrow, tx('span', 'bkbg-rn-product', o.productName, { color: o.headerColor }));
            ap(header, hrow);
            if (o.showMeta && o.releaseDate) {
                ap(header, tx('div', 'bkbg-rn-date', '📅 Released ' + o.releaseDate, { color: o.headerColor }));
            }
            ap(block, header);

            // ── Intro ─────────────────────────────────────────────
            if (o.showIntro && o.intro) {
                var intro = tx('div', 'bkbg-rn-intro', o.intro, {
                    background: o.introBg,
                    borderColor: o.borderColor,
                    color: o.introColor
                });
                ap(block, intro);
            }

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

            o.sections.forEach(function (sec, si) {
                if (!sec || !sec.items || sec.items.length === 0) return;
                var m = sectionMeta(sec.type, o);

                var section = mk('div', 'bkbg-rn-section');

                // Section heading
                var shead = mk('div', 'bkbg-rn-section-head');
                var pill  = mk('span', 'bkbg-rn-type-pill', { background: m.bg, color: m.color });
                var dot   = mk('span', 'bkbg-rn-type-dot', { background: m.dot });
                ap(pill, dot);
                pill.appendChild(document.createTextNode(m.label));
                ap(shead, pill);
                ap(shead, tx('span', 'bkbg-rn-count', sec.items.length + ' item' + (sec.items.length !== 1 ? 's' : '')));
                ap(section, shead);

                // Items
                var list = mk('ul', 'bkbg-rn-list');
                sec.items.forEach(function (item, ii) {
                    var li = mk('li', 'bkbg-rn-item', {
                        padding: o.itemSpacing + 'px 0',
                        borderBottomColor: o.borderColor
                    });
                    var dash = tx('span', 'bkbg-rn-dash', '—', { color: m.dot });
                    var txt  = tx('span', '', item, { color: o.textColor });
                    ap(li, dash, txt);
                    ap(list, li);
                });
                ap(section, list);
                ap(body, section);
            });

            // Footer links
            if (o.showLinks && (o.changelogUrl || o.compareUrl)) {
                var linksRow = mk('div', 'bkbg-rn-links', { borderTopColor: o.borderColor });
                if (o.changelogUrl) {
                    var cl = mk('a', 'bkbg-rn-link', { color: o.accentColor });
                    cl.href = o.changelogUrl; cl.textContent = '📋 Full Changelog →';
                    ap(linksRow, cl);
                }
                if (o.compareUrl) {
                    var cr = mk('a', 'bkbg-rn-link', { color: o.accentColor });
                    cr.href = o.compareUrl; cr.textContent = '🔀 Compare Changes →';
                    ap(linksRow, cr);
                }
                ap(body, linksRow);
            }

            ap(block, body);
            appEl.parentNode.insertBefore(block, appEl);
            appEl.style.display = 'none';
        });
    }

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

```
