( function () {
var el = wp.element.createElement;
var Fragment = wp.element.Fragment;
var __ = wp.i18n.__;
function getTypographyControl() {
return (window.bkbgTypographyControl || function () { return null; });
}
function _tv(typo, prefix) {
if (!typo) return {};
var s = {};
if (typo.family) s[prefix + 'font-family'] = "'" + typo.family + "', sans-serif";
if (typo.weight) s[prefix + 'font-weight'] = typo.weight;
if (typo.transform) s[prefix + 'text-transform'] = typo.transform;
if (typo.style) s[prefix + 'font-style'] = typo.style;
if (typo.decoration) s[prefix + 'text-decoration'] = typo.decoration;
var su = typo.sizeUnit || 'px';
if (typo.sizeDesktop !== '' && typo.sizeDesktop != null) s[prefix + 'font-size-d'] = typo.sizeDesktop + su;
if (typo.sizeTablet !== '' && typo.sizeTablet != null) s[prefix + 'font-size-t'] = typo.sizeTablet + su;
if (typo.sizeMobile !== '' && typo.sizeMobile != null) s[prefix + 'font-size-m'] = typo.sizeMobile + su;
var lhu = typo.lineHeightUnit || '';
if (typo.lineHeightDesktop !== '' && typo.lineHeightDesktop != null) s[prefix + 'line-height-d'] = typo.lineHeightDesktop + lhu;
if (typo.lineHeightTablet !== '' && typo.lineHeightTablet != null) s[prefix + 'line-height-t'] = typo.lineHeightTablet + lhu;
if (typo.lineHeightMobile !== '' && typo.lineHeightMobile != null) s[prefix + 'line-height-m'] = typo.lineHeightMobile + lhu;
var lsu = typo.letterSpacingUnit || 'px';
if (typo.letterSpacingDesktop !== '' && typo.letterSpacingDesktop != null) s[prefix + 'letter-spacing-d'] = typo.letterSpacingDesktop + lsu;
if (typo.letterSpacingTablet !== '' && typo.letterSpacingTablet != null) s[prefix + 'letter-spacing-t'] = typo.letterSpacingTablet + lsu;
if (typo.letterSpacingMobile !== '' && typo.letterSpacingMobile != null) s[prefix + 'letter-spacing-m'] = typo.letterSpacingMobile + lsu;
var wsu = typo.wordSpacingUnit || 'px';
if (typo.wordSpacingDesktop !== '' && typo.wordSpacingDesktop != null) s[prefix + 'word-spacing-d'] = typo.wordSpacingDesktop + wsu;
if (typo.wordSpacingTablet !== '' && typo.wordSpacingTablet != null) s[prefix + 'word-spacing-t'] = typo.wordSpacingTablet + wsu;
if (typo.wordSpacingMobile !== '' && typo.wordSpacingMobile != null) s[prefix + 'word-spacing-m'] = typo.wordSpacingMobile + wsu;
return s;
}
var registerBlockType = wp.blocks.registerBlockType;
var InspectorControls = wp.blockEditor.InspectorControls;
var useBlockProps = wp.blockEditor.useBlockProps;
var PanelBody = wp.components.PanelBody;
var PanelColorSettings = wp.blockEditor.PanelColorSettings;
var ToggleControl = wp.components.ToggleControl;
var RangeControl = wp.components.RangeControl;
var SelectControl = wp.components.SelectControl;
var TextControl = wp.components.TextControl;
var separatorSVGs = {
chevron: '',
arrow: '',
slash: null,
dot: null,
dash: null,
custom: null
};
var homeIconSVG = '';
function getSepChar(sep, custom) {
if (sep === 'chevron') return '❯';
if (sep === 'arrow') return '›';
if (sep === 'slash') return '/';
if (sep === 'dot') return '·';
if (sep === 'dash') return '–';
return custom || '/';
}
registerBlockType('blockenberg/breadcrumbs', {
title: __('Breadcrumbs', 'blockenberg'),
description: __('SEO-friendly navigation trail with Schema.org markup.', 'blockenberg'),
category: 'bkbg-layout',
icon: el('svg', { viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg' },
el('path', { d: 'M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z', stroke: 'currentColor', strokeWidth: 2, fill: 'none' }),
el('polyline', { points: '9 22 9 12 15 12 15 22', stroke: 'currentColor', strokeWidth: 2, fill: 'none' })
),
attributes: {
homeLabel: { type: 'string', default: 'Home' },
homeUrl: { type: 'string', default: '/' },
showHome: { type: 'boolean', default: true },
showCurrentPage: { type: 'boolean', default: true },
separator: { type: 'string', default: 'chevron' },
customSeparator: { type: 'string', default: '/' },
schemaEnabled: { type: 'boolean', default: true },
alignment: { type: 'string', default: 'left' },
fontSize: { type: 'number', default: 14 },
itemSpacing: { type: 'number', default: 8 },
paddingV: { type: 'number', default: 10 },
textColor: { type: 'string', default: '#6b7280' },
linkColor: { type: 'string', default: '#2563eb' },
linkHoverColor: { type: 'string', default: '#1d4ed8' },
separatorColor: { type: 'string', default: '#9ca3af' },
activeColor: { type: 'string', default: '#111827' },
bgColor: { type: 'string', default: '' },
fontWeight: { type: 'number', default: 400 },
showHomeIcon: { type: 'boolean', default: true },
typoText: { type: 'object', default: {} }
},
edit: function (props) {
var a = props.attributes;
var setAttr = props.setAttributes;
var blockProps = useBlockProps({
className: 'bkbg-bc-wrap bkbg-bc-align--' + a.alignment,
style: Object.assign({
'--bkbg-bc-gap': a.itemSpacing + 'px',
'--bkbg-bc-padv': a.paddingV + 'px',
'--bkbg-bc-text': a.textColor,
'--bkbg-bc-link': a.linkColor,
'--bkbg-bc-hover': a.linkHoverColor,
'--bkbg-bc-sep': a.separatorColor,
'--bkbg-bc-active': a.activeColor,
background: a.bgColor || undefined
}, _tv(a.typoText, '--bkbg-bc-typo-'))
});
var inspector = el(InspectorControls, null,
el(PanelBody, { title: __('Content', 'blockenberg'), initialOpen: true },
el(ToggleControl, {
label: __('Show Home link', 'blockenberg'),
checked: a.showHome,
onChange: function(v){ setAttr({ showHome: v }); },
__nextHasNoMarginBottom: true
}),
a.showHome && el(Fragment, null,
el(TextControl, {
label: __('Home label', 'blockenberg'),
value: a.homeLabel,
onChange: function(v){ setAttr({ homeLabel: v }); }
}),
el(TextControl, {
label: __('Home URL', 'blockenberg'),
value: a.homeUrl,
onChange: function(v){ setAttr({ homeUrl: v }); }
}),
el(ToggleControl, {
label: __('Show home icon', 'blockenberg'),
checked: a.showHomeIcon,
onChange: function(v){ setAttr({ showHomeIcon: v }); },
__nextHasNoMarginBottom: true
})
),
el(ToggleControl, {
label: __('Show current page', 'blockenberg'),
checked: a.showCurrentPage,
onChange: function(v){ setAttr({ showCurrentPage: v }); },
__nextHasNoMarginBottom: true
}),
el(ToggleControl, {
label: __('Schema.org markup (BreadcrumbList)', 'blockenberg'),
checked: a.schemaEnabled,
onChange: function(v){ setAttr({ schemaEnabled: v }); },
__nextHasNoMarginBottom: true
})
),
el(PanelBody, { title: __('Separator', 'blockenberg'), initialOpen: false },
el(SelectControl, {
label: __('Separator style', 'blockenberg'),
value: a.separator,
options: [
{ label: 'Chevron ›', value: 'chevron' },
{ label: 'Arrow →', value: 'arrow' },
{ label: 'Slash /', value: 'slash' },
{ label: 'Dot ·', value: 'dot' },
{ label: 'Dash –', value: 'dash' },
{ label: 'Custom', value: 'custom' }
],
onChange: function(v){ setAttr({ separator: v }); }
}),
a.separator === 'custom' && el(TextControl, {
label: __('Custom separator character', 'blockenberg'),
value: a.customSeparator,
onChange: function(v){ setAttr({ customSeparator: v }); }
})
),
el(PanelBody, { title: __('Layout', 'blockenberg'), initialOpen: false },
el(SelectControl, {
label: __('Alignment', 'blockenberg'),
value: a.alignment,
options: [
{ label: 'Left', value: 'left' },
{ label: 'Center', value: 'center' },
{ label: 'Right', value: 'right' }
],
onChange: function(v){ setAttr({ alignment: v }); }
}),
el(RangeControl, {
label: __('Item spacing (px)', 'blockenberg'),
value: a.itemSpacing, min: 2, max: 32,
onChange: function(v){ setAttr({ itemSpacing: v }); }
}),
el(RangeControl, {
label: __('Vertical padding (px)', 'blockenberg'),
value: a.paddingV, min: 0, max: 40,
onChange: function(v){ setAttr({ paddingV: v }); }
})
),
el( PanelBody, { title: __( 'Typography', 'blockenberg' ), initialOpen: false },
el(getTypographyControl(), { label: __('Breadcrumb Text', 'blockenberg'), value: a.typoText, onChange: function (v) { setAttr({ typoText: v }); } })
),
el(PanelBody, { title: __('Colors', 'blockenberg'), initialOpen: false },
el(PanelColorSettings, {
title: __('Colors', 'blockenberg'),
initialOpen: false,
colorSettings: [
{ label: __('Background', 'blockenberg'), value: a.bgColor, onChange: function(v){ setAttr({ bgColor: v||'' }); } },
{ label: __('Link color', 'blockenberg'), value: a.linkColor, onChange: function(v){ setAttr({ linkColor: v||'#2563eb' }); } },
{ label: __('Link hover', 'blockenberg'), value: a.linkHoverColor,onChange: function(v){ setAttr({ linkHoverColor: v||'#1d4ed8' }); } },
{ label: __('Current page', 'blockenberg'), value: a.activeColor, onChange: function(v){ setAttr({ activeColor: v||'#111827' }); } },
{ label: __('Separator', 'blockenberg'), value: a.separatorColor,onChange: function(v){ setAttr({ separatorColor: v||'#9ca3af' }); } },
{ label: __('Text (general)', 'blockenberg'), value: a.textColor, onChange: function(v){ setAttr({ textColor: v||'#6b7280' }); } }
]
})
)
);
/* ── Preview breadcrumbs ── */
var sepChar = getSepChar(a.separator, a.customSeparator);
var crumbs = [];
if (a.showHome) {
crumbs.push({ label: a.homeLabel, isHome: true, url: a.homeUrl });
}
crumbs.push({ label: 'Category', url: '#' });
crumbs.push({ label: 'Current Page', url: '', isCurrent: true });
var crumbEls = crumbs.map(function(c, i) {
var isLast = i === crumbs.length - 1;
return el(Fragment, { key: i },
el('span', {
className: 'bkbg-bc-item' + (c.isCurrent ? ' bkbg-bc-item--current' : '')
},
c.isHome && a.showHomeIcon
? el('span', { className: 'bkbg-bc-home-icon', dangerouslySetInnerHTML: { __html: homeIconSVG } })
: null,
c.url && !c.isCurrent
? el('a', { href: '#', className: 'bkbg-bc-link' }, c.isHome && a.showHomeIcon ? '' : c.label)
: (!c.isHome || !a.showHomeIcon) && el('span', { className: 'bkbg-bc-text' }, c.label)
),
!isLast && el('span', { className: 'bkbg-bc-sep', 'aria-hidden': 'true' }, sepChar)
);
});
return el(Fragment, null,
inspector,
el('nav', Object.assign({}, blockProps, { 'aria-label': 'Breadcrumb' }),
el('ol', { className: 'bkbg-bc-list' }, ...crumbEls)
)
);
},
save: function (props) {
var a = props.attributes;
var blockProps = wp.blockEditor.useBlockProps.save({
className: 'bkbg-bc-wrap bkbg-bc-align--' + a.alignment,
'aria-label': 'Breadcrumb',
'data-home-label': a.homeLabel,
'data-home-url': a.homeUrl,
'data-show-home': a.showHome ? '1' : '0',
'data-show-current': a.showCurrentPage ? '1' : '0',
'data-separator': a.separator,
'data-sep-custom': a.customSeparator,
'data-schema': a.schemaEnabled ? '1' : '0',
'data-show-icon': a.showHomeIcon ? '1' : '0',
style: Object.assign({
'--bkbg-bc-gap': a.itemSpacing + 'px',
'--bkbg-bc-padv': a.paddingV + 'px',
'--bkbg-bc-text': a.textColor,
'--bkbg-bc-link': a.linkColor,
'--bkbg-bc-hover': a.linkHoverColor,
'--bkbg-bc-sep': a.separatorColor,
'--bkbg-bc-active': a.activeColor,
background: a.bgColor || undefined
}, _tv(a.typoText, '--bkbg-bc-typo-'))
});
return el('nav', blockProps,
el('ol', { className: 'bkbg-bc-list', 'aria-label': 'breadcrumb' })
);
}
});
}() );