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 / customer-results / index.js

index.js in Blockenberg — 600+ Advanced Gutenberg Blocks & AI Agent for WordPress Block Editor 2.0.7, at blocks/customer-results/index.js

181 lines 17.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 ( function () {
2 var el = wp.element.createElement;
3 var __ = wp.i18n.__;
4 var registerBlockType = wp.blocks.registerBlockType;
5 var InspectorControls = wp.blockEditor.InspectorControls;
6 var MediaUpload = wp.blockEditor.MediaUpload;
7 var MediaUploadCheck = wp.blockEditor.MediaUploadCheck;
8 var useBlockProps = wp.blockEditor.useBlockProps;
9 var RichText = wp.blockEditor.RichText;
10 var PanelColorSettings = wp.blockEditor.PanelColorSettings;
11 var PanelBody = wp.components.PanelBody;
12 var ToggleControl = wp.components.ToggleControl;
13 var RangeControl = wp.components.RangeControl;
14 var SelectControl = wp.components.SelectControl;
15 var TextControl = wp.components.TextControl;
16 var TextareaControl = wp.components.TextareaControl;
17 var Button = wp.components.Button;
18
19 var _crsTC, _crsTV;
20 function _tc() { return _crsTC || (_crsTC = window.bkbgTypographyControl); }
21 function _tv(typo, prefix) { return _crsTV ? _crsTV(typo, prefix) : ((_crsTV = window.bkbgTypoCssVars) ? _crsTV(typo, prefix) : {}); }
22
23 function setResult(results, idx, key, val, setAttr) {
24 var next = results.map(function (r, i) { return i === idx ? Object.assign({}, r, { [key]: val }) : r; });
25 setAttr({ results: next });
26 }
27 function setMetric(results, rIdx, mIdx, key, val, setAttr) {
28 var next = results.map(function (r, i) {
29 if (i !== rIdx) return r;
30 var metrics = r.metrics.map(function (m, j) { return j === mIdx ? Object.assign({}, m, { [key]: val }) : m; });
31 return Object.assign({}, r, { metrics: metrics });
32 });
33 setAttr({ results: next });
34 }
35
36 function renderResultCard(result, attr) {
37 return el('div', { className: 'bkbg-crs-card', style: { background: attr.cardBg, borderColor: attr.cardBorder } },
38 /* Company logo / name */
39 attr.showLogo && el('div', { className: 'bkbg-crs-company-row', style: { background: attr.logoBg } },
40 result.companyLogo
41 ? el('img', { src: result.companyLogo, className: 'bkbg-crs-company-logo', alt: result.companyName })
42 : el('div', { className: 'bkbg-crs-company-name-fallback', style: { color: attr.accentColor } }, result.companyName)
43 ),
44 /* Quote */
45 el('blockquote', { className: 'bkbg-crs-quote', style: { color: attr.quoteColor } }, '"' + result.quote + '"'),
46 /* Author */
47 attr.showAuthor && el('div', { className: 'bkbg-crs-author-row' },
48 el('div', { className: 'bkbg-crs-author-name', style: { color: attr.authorColor } }, result.authorName),
49 el('div', { className: 'bkbg-crs-author-title', style: { color: attr.titleColor } }, result.authorTitle)
50 ),
51 /* Metrics */
52 attr.showMetrics && result.metrics && result.metrics.length > 0 && el('div', { className: 'bkbg-crs-metrics' },
53 result.metrics.map(function (m, mi) {
54 return el('div', { key: mi, className: 'bkbg-crs-metric' },
55 el('div', { className: 'bkbg-crs-metric-val', style: { color: attr.metricNumColor, fontSize: (attr.metricNumFontSize || 28) + 'px' } }, m.value),
56 el('div', { className: 'bkbg-crs-metric-label', style: { color: attr.metricLabelColor, fontSize: (attr.metricLabelFontSize || 13) + 'px' } }, m.label)
57 );
58 })
59 ),
60 /* Tags */
61 attr.showTags && result.tags && result.tags.length > 0 && el('div', { className: 'bkbg-crs-tags' },
62 result.tags.map(function (tag, ti) {
63 return el('span', { key: ti, className: 'bkbg-crs-tag', style: { background: attr.tagBg, color: attr.tagColor } }, tag);
64 })
65 )
66 );
67 }
68
69 registerBlockType('blockenberg/customer-results', {
70 edit: function (props) {
71 var attr = props.attributes;
72 var setAttr = props.setAttributes;
73
74 return el(wp.element.Fragment, null,
75 el(InspectorControls, null,
76 el(PanelBody, { title: __('Content', 'blockenberg'), initialOpen: true },
77 el(TextControl, { label: __('Eyebrow', 'blockenberg'), value: attr.eyebrow, onChange: function (v) { setAttr({ eyebrow: v }); }, __nextHasNoMarginBottom: true }),
78 el(TextControl, { label: __('Heading', 'blockenberg'), value: attr.heading, onChange: function (v) { setAttr({ heading: v }); }, __nextHasNoMarginBottom: true }),
79 el(TextControl, { label: __('Subtext', 'blockenberg'), value: attr.subtext, onChange: function (v) { setAttr({ subtext: v }); }, __nextHasNoMarginBottom: true })
80 ),
81 el(PanelBody, { title: __('Layout', 'blockenberg'), initialOpen: false },
82 el(SelectControl, { label: __('Layout', 'blockenberg'), value: attr.layout, options: [{ label: 'Grid', value: 'grid' }, { label: 'List (horizontal)', value: 'list' }, { label: 'Featured First', value: 'featured' }], onChange: function (v) { setAttr({ layout: v }); }, __nextHasNoMarginBottom: true }),
83 el(RangeControl, { label: __('Columns (grid)', 'blockenberg'), value: attr.columns, min: 1, max: 4, onChange: function (v) { setAttr({ columns: v }); }, __nextHasNoMarginBottom: true }),
84 el(ToggleControl, { label: __('Show Company Logo', 'blockenberg'), checked: attr.showLogo, onChange: function (v) { setAttr({ showLogo: v }); }, __nextHasNoMarginBottom: true }),
85 el(ToggleControl, { label: __('Show Author', 'blockenberg'), checked: attr.showAuthor, onChange: function (v) { setAttr({ showAuthor: v }); }, __nextHasNoMarginBottom: true }),
86 el(ToggleControl, { label: __('Show Metrics', 'blockenberg'), checked: attr.showMetrics, onChange: function (v) { setAttr({ showMetrics: v }); }, __nextHasNoMarginBottom: true }),
87 el(ToggleControl, { label: __('Show Tags', 'blockenberg'), checked: attr.showTags, onChange: function (v) { setAttr({ showTags: v }); }, __nextHasNoMarginBottom: true }),
88 el(RangeControl, { label: __('Max Width', 'blockenberg'), value: attr.maxWidth, min: 600, max: 1600, step: 20, onChange: function (v) { setAttr({ maxWidth: v }); }, __nextHasNoMarginBottom: true }),
89 el(RangeControl, { label: __('Padding Top', 'blockenberg'), value: attr.paddingTop, min: 0, max: 200, onChange: function (v) { setAttr({ paddingTop: v }); }, __nextHasNoMarginBottom: true }),
90 el(RangeControl, { label: __('Padding Bottom', 'blockenberg'), value: attr.paddingBottom, min: 0, max: 200, onChange: function (v) { setAttr({ paddingBottom: v }); }, __nextHasNoMarginBottom: true })
91 ),
92 el(PanelColorSettings, {
93 title: __('Colors', 'blockenberg'), initialOpen: false,
94 colorSettings: [
95 { label: __('Background', 'blockenberg'), value: attr.bgColor, onChange: function (v) { setAttr({ bgColor: v || '#f8fafc' }); } },
96 { label: __('Heading', 'blockenberg'), value: attr.headingColor, onChange: function (v) { setAttr({ headingColor: v || '#111827' }); } },
97 { label: __('Subtext', 'blockenberg'), value: attr.subColor, onChange: function (v) { setAttr({ subColor: v || '#6b7280' }); } },
98 { label: __('Eyebrow', 'blockenberg'), value: attr.eyebrowColor, onChange: function (v) { setAttr({ eyebrowColor: v || '#6366f1' }); } },
99 { label: __('Card Background', 'blockenberg'), value: attr.cardBg, onChange: function (v) { setAttr({ cardBg: v || '#ffffff' }); } },
100 { label: __('Card Border', 'blockenberg'), value: attr.cardBorder, onChange: function (v) { setAttr({ cardBorder: v || '#e2e8f0' }); } },
101 { label: __('Quote Text', 'blockenberg'), value: attr.quoteColor, onChange: function (v) { setAttr({ quoteColor: v || '#374151' }); } },
102 { label: __('Author Name', 'blockenberg'), value: attr.authorColor, onChange: function (v) { setAttr({ authorColor: v || '#111827' }); } },
103 { label: __('Author Title', 'blockenberg'), value: attr.titleColor, onChange: function (v) { setAttr({ titleColor: v || '#6b7280' }); } },
104 { label: __('Metric Number', 'blockenberg'), value: attr.metricNumColor, onChange: function (v) { setAttr({ metricNumColor: v || '#6366f1' }); } },
105 { label: __('Metric Label', 'blockenberg'), value: attr.metricLabelColor, onChange: function (v) { setAttr({ metricLabelColor: v || '#6b7280' }); } },
106 { label: __('Tag Background', 'blockenberg'), value: attr.tagBg, onChange: function (v) { setAttr({ tagBg: v || '#ede9fe' }); } },
107 { label: __('Tag Text', 'blockenberg'), value: attr.tagColor, onChange: function (v) { setAttr({ tagColor: v || '#6d28d9' }); } }
108 ]
109 }),
110 el(PanelBody, { title: __('Typography', 'blockenberg'), initialOpen: false },
111 _tc() && el(_tc(), { label: __('Eyebrow', 'blockenberg'), typo: attr.typoEyebrow || {}, onChange: function(v) { setAttr({ typoEyebrow: v }); } }),
112 _tc() && el(_tc(), { label: __('Heading', 'blockenberg'), typo: attr.typoHeading || {}, onChange: function(v) { setAttr({ typoHeading: v }); } }),
113 _tc() && el(_tc(), { label: __('Subtext', 'blockenberg'), typo: attr.typoSubtext || {}, onChange: function(v) { setAttr({ typoSubtext: v }); } }),
114 el(RangeControl, { label: __('Metric number font size (px)', 'blockenberg'), value: attr.metricNumFontSize, min: 16, max: 48, onChange: function (v) { setAttr({ metricNumFontSize: v }); }, __nextHasNoMarginBottom: true }),
115 el(RangeControl, { label: __('Metric label font size (px)', 'blockenberg'), value: attr.metricLabelFontSize, min: 10, max: 18, onChange: function (v) { setAttr({ metricLabelFontSize: v }); }, __nextHasNoMarginBottom: true })
116 ),
117 /* Customer result panels */
118 el(PanelBody, { title: __('Customer Stories', 'blockenberg'), initialOpen: false },
119 attr.results.map(function (result, idx) {
120 return el(PanelBody, { key: idx, title: (result.companyName || 'Story ' + (idx + 1)), initialOpen: false },
121 el(TextControl, { label: __('Company Name', 'blockenberg'), value: result.companyName, onChange: function (v) { setResult(attr.results, idx, 'companyName', v, setAttr); }, __nextHasNoMarginBottom: true }),
122 el(TextareaControl, { label: __('Quote', 'blockenberg'), value: result.quote, onChange: function (v) { setResult(attr.results, idx, 'quote', v, setAttr); }, __nextHasNoMarginBottom: true }),
123 el(TextControl, { label: __('Author Name', 'blockenberg'), value: result.authorName, onChange: function (v) { setResult(attr.results, idx, 'authorName', v, setAttr); }, __nextHasNoMarginBottom: true }),
124 el(TextControl, { label: __('Author Title', 'blockenberg'), value: result.authorTitle, onChange: function (v) { setResult(attr.results, idx, 'authorTitle', v, setAttr); }, __nextHasNoMarginBottom: true }),
125 el(TextControl, { label: __('Tags (comma-separated)', 'blockenberg'), value: (result.tags || []).join(', '), onChange: function (v) { setResult(attr.results, idx, 'tags', v.split(',').map(function (t) { return t.trim(); }).filter(Boolean), setAttr); }, __nextHasNoMarginBottom: true }),
126 el('p', { style: { fontWeight: 600, fontSize: 12, margin: '8px 0 4px' } }, __('Metrics', 'blockenberg')),
127 (result.metrics || []).map(function (metric, mi) {
128 return el('div', { key: mi, style: { display: 'flex', gap: 8, marginBottom: 6 } },
129 el(TextControl, { label: __('Value', 'blockenberg'), value: metric.value, onChange: function (v) { setMetric(attr.results, idx, mi, 'value', v, setAttr); }, __nextHasNoMarginBottom: true }),
130 el(TextControl, { label: __('Label', 'blockenberg'), value: metric.label, onChange: function (v) { setMetric(attr.results, idx, mi, 'label', v, setAttr); }, __nextHasNoMarginBottom: true })
131 );
132 }),
133 el('p', { style: { fontWeight: 600, fontSize: 12, marginBottom: 4 } }, __('Company Logo', 'blockenberg')),
134 el(MediaUploadCheck, null,
135 el(MediaUpload, {
136 onSelect: function (m) { setResult(attr.results, idx, 'companyLogo', m.url, setAttr); },
137 allowedTypes: ['image'], value: result.companyLogo,
138 render: function (rp) {
139 return el('div', null,
140 result.companyLogo && el('img', { src: result.companyLogo, style: { maxHeight: 36, display: 'block', marginBottom: 6 } }),
141 el(Button, { onClick: rp.open, variant: 'secondary', size: 'small' }, result.companyLogo ? __('Change', 'blockenberg') : __('Upload Logo', 'blockenberg')),
142 result.companyLogo && el(Button, { onClick: function () { setResult(attr.results, idx, 'companyLogo', '', setAttr); }, variant: 'link', isDestructive: true, size: 'small', style: { marginLeft: 8 } }, __('Remove', 'blockenberg'))
143 );
144 }
145 })
146 ),
147 el(Button, { onClick: function () { setAttr({ results: attr.results.filter(function (_, i) { return i !== idx; }) }); }, variant: 'link', isDestructive: true, __nextHasNoMarginBottom: true }, __('Remove Story', 'blockenberg'))
148 );
149 }),
150 el(Button, { onClick: function () { setAttr({ results: attr.results.concat([{ companyName: 'New Company', companyLogo: '', authorName: 'Name', authorTitle: 'Title', quote: 'Amazing results!', metrics: [{ value: '0%', label: 'Improvement' }], tags: [] }]) }); }, variant: 'secondary', style: { marginTop: 8 } }, __('+ Add Story', 'blockenberg'))
151 )
152 ),
153 /* Editor Preview */
154 el('div', Object.assign(useBlockProps({ className: 'bkbg-crs-editor', style: Object.assign({ background: attr.bgColor },
155 { '--bkbg-crs-eye-fs': (attr.eyebrowFontSize || 14) + 'px', '--bkbg-crs-hdg-fs': (attr.headingFontSize || 28) + 'px', '--bkbg-crs-sub-fs': (attr.subtextFontSize || 16) + 'px' },
156 _tv(attr.typoEyebrow, '--bkbg-crs-eye-'),
157 _tv(attr.typoHeading, '--bkbg-crs-hdg-'),
158 _tv(attr.typoSubtext, '--bkbg-crs-sub-')) })),
159 el('div', { className: 'bkbg-crs-inner', style: { maxWidth: attr.maxWidth + 'px', margin: '0 auto', padding: attr.paddingTop + 'px 24px ' + attr.paddingBottom + 'px' } },
160 el('div', { className: 'bkbg-crs-header', style: { textAlign: 'center', marginBottom: 48 } },
161 el(RichText, { tagName: 'p', className: 'bkbg-crs-eyebrow', style: { color: attr.eyebrowColor }, value: attr.eyebrow, onChange: function (v) { setAttr({ eyebrow: v }); }, placeholder: __('Eyebrow…', 'blockenberg') }),
162 el(RichText, { tagName: 'h2', className: 'bkbg-crs-heading', style: { color: attr.headingColor }, value: attr.heading, onChange: function (v) { setAttr({ heading: v }); }, placeholder: __('Heading…', 'blockenberg') }),
163 el(RichText, { tagName: 'p', className: 'bkbg-crs-sub', style: { color: attr.subColor }, value: attr.subtext, onChange: function (v) { setAttr({ subtext: v }); }, placeholder: __('Subtext…', 'blockenberg') })
164 ),
165 el('div', { className: 'bkbg-crs-grid layout-' + attr.layout, style: { gridTemplateColumns: attr.layout === 'grid' ? 'repeat(' + attr.columns + ',1fr)' : undefined } },
166 attr.results.map(function (result, idx) { return el(wp.element.Fragment, { key: idx }, renderResultCard(result, attr)); })
167 )
168 )
169 )
170 );
171 },
172 save: function (props) {
173 var attr = props.attributes;
174 var useBlockProps = wp.blockEditor.useBlockProps;
175 return el('div', useBlockProps.save(),
176 el('div', { className: 'bkbg-crs-app', 'data-opts': JSON.stringify(attr) })
177 );
178 }
179 });
180 }() );
181