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 / logo-grid / index.js

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

187 lines 13.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ====================================================
2 Logo Grid Block — editor (index.js)
3 Block: blockenberg/logo-grid
4 ==================================================== */
5 ( function () {
6 var el = wp.element.createElement;
7 var Fragment = wp.element.Fragment;
8 var useState = wp.element.useState;
9 var MediaUpload = wp.blockEditor.MediaUpload;
10 var MediaUploadCheck = wp.blockEditor.MediaUploadCheck;
11 var registerBlockType = wp.blocks.registerBlockType;
12 var InspectorControls = wp.blockEditor.InspectorControls;
13 var useBlockProps = wp.blockEditor.useBlockProps;
14 var PanelBody = wp.components.PanelBody;
15 var PanelColorSettings = wp.blockEditor.PanelColorSettings;
16 var RangeControl = wp.components.RangeControl;
17 var SelectControl = wp.components.SelectControl;
18 var ToggleControl = wp.components.ToggleControl;
19 var TextControl = wp.components.TextControl;
20 var Button = wp.components.Button;
21 var __ = wp.i18n.__;
22
23 var _tc, _tv;
24 function getTypoControl() { return _tc || (_tc = window.bkbgTypographyControl); }
25 function getTypoCssVars() { return _tv || (_tv = window.bkbgTypoCssVars); }
26
27 function uid() { return 'lg' + Math.random().toString(36).slice(2,6); }
28 function move(arr, from, to) { var a=arr.slice(); a.splice(to,0,a.splice(from,1)[0]); return a; }
29
30 function wrapStyle(a) {
31 var _tvFn = getTypoCssVars();
32 var s = {
33 '--bkbg-logg-cols': a.columns,
34 '--bkbg-logg-gap': a.gap + 'px',
35 '--bkbg-logg-h': a.logoHeight + 'px',
36 '--bkbg-logg-pad': a.logoPadding + 'px',
37 '--bkbg-logg-r': a.logoRadius + 'px',
38 '--bkbg-logg-pt': a.paddingTop + 'px',
39 '--bkbg-logg-pb': a.paddingBottom + 'px',
40 '--bkbg-logg-label-c': a.labelColor,
41 '--bkbg-logg-bg': a.logoBg,
42 '--bkbg-logg-brd': a.logoBorder,
43 '--bkbg-logg-tint': a.logoTint,
44 background: a.sectionBg || undefined,
45 };
46 if (_tvFn) Object.assign(s, _tvFn(a.labelTypo, '--bkbg-logg-l-'));
47 return s;
48 }
49
50 registerBlockType('blockenberg/logo-grid', {
51 edit: function (props) {
52 var a = props.attributes;
53 var setAttr = props.setAttributes;
54 var logos = a.logos;
55
56 var _act = useState(null);
57 var activeId = _act[0]; var setActiveId = _act[1];
58
59 function updateLogo(id, patch) {
60 setAttr({ logos: logos.map(function(l){ return l.id===id ? Object.assign({},l,patch) : l; }) });
61 }
62
63 var blockProps = useBlockProps({ className:'bkbg-logg-wrap bkbg-logg-layout--'+a.layout, style:wrapStyle(a) });
64
65 var labelEl = a.showLabel ? el('p', { className:'bkbg-logg-label bkbg-logg-label--'+a.labelPosition }, a.label) : null;
66
67 var grid = el('div', { className:'bkbg-logg-grid' + (a.hoverColor && a.grayscale ? ' bkbg-logg-hover-color' : '') },
68 logos.map(function(logo) {
69 return el('div', { key:logo.id, className:'bkbg-logg-item' + (a.showBox ? ' bkbg-logg-box' : '') + (a.grayscale ? ' bkbg-logg-grayscale' : ''), title:logo.name },
70 logo.imageUrl
71 ? el('img', { src:logo.imageUrl, alt:logo.name, className:'bkbg-logg-img' })
72 : el('span', { className:'bkbg-logg-text' }, logo.name),
73 el(MediaUploadCheck, null,
74 el(MediaUpload, {
75 onSelect:function(m){ updateLogo(logo.id,{imageUrl:m.url,imageId:m.id}); },
76 allowedTypes:['image'], value:logo.imageId,
77 render:function(o){ return el(Button, { onClick:o.open, className:'bkbg-logg-upload-btn', isSmall:true }, logo.imageUrl ? __('Replace','blockenberg') : __('Upload','blockenberg')); }
78 })
79 )
80 );
81 })
82 );
83
84 function logoRow(logo, idx) {
85 var isActive = activeId === logo.id;
86 return el('div', { key:logo.id },
87 el('div', { style:{display:'flex',alignItems:'center',gap:'6px',background:isActive?'#f3f0ff':'#f8f9fa',border:isActive?'1px solid #6c3fb5':'1px solid #e2e8f0',borderRadius:'6px',padding:'6px 8px',marginBottom:'4px',cursor:'pointer'}, onClick:function(){ setActiveId(isActive?null:logo.id); } },
88 logo.imageUrl ? el('img', { src:logo.imageUrl, style:{height:'18px',objectFit:'contain',marginRight:'4px'} }) : el('span', { style:{fontSize:'13px',color:'#94a3b8'} }, '🖼️'),
89 el('span', { style:{flex:1,fontSize:'13px'} }, logo.name||'(logo)'),
90 el(Button, { icon:'arrow-up', isSmall:true, disabled:idx===0, onClick:function(e){ e.stopPropagation(); setAttr({logos:move(logos,idx,idx-1)}); } }),
91 el(Button, { icon:'arrow-down', isSmall:true, disabled:idx===logos.length-1, onClick:function(e){ e.stopPropagation(); setAttr({logos:move(logos,idx,idx+1)}); } }),
92 el(Button, { icon:'no-alt', isSmall:true, isDestructive:true, onClick:function(e){ e.stopPropagation(); setAttr({logos:logos.filter(function(_,i){ return i!==idx; })}); if(activeId===logo.id) setActiveId(null); } })
93 ),
94 isActive ? el('div', { style:{padding:'8px',background:'#faf8ff',border:'1px solid #6c3fb5',borderTop:'none',borderRadius:'0 0 6px 6px',marginBottom:'4px'} },
95 el(TextControl, { label:__('Company name','blockenberg'), value:logo.name, onChange:function(v){ updateLogo(logo.id,{name:v}); } }),
96 el(MediaUploadCheck, null,
97 el(MediaUpload, {
98 onSelect:function(m){ updateLogo(logo.id,{imageUrl:m.url,imageId:m.id}); },
99 allowedTypes:['image'], value:logo.imageId,
100 render:function(o){ return el(Button, { onClick:o.open, variant:'secondary', isSmall:true }, logo.imageUrl ? __('Change logo','blockenberg') : __('Upload logo','blockenberg')); }
101 })
102 ),
103 logo.imageUrl ? el(Button, { isDestructive:true, variant:'tertiary', isSmall:true, style:{marginTop:'4px'}, onClick:function(){ updateLogo(logo.id,{imageUrl:'',imageId:0}); } }, __('Remove','blockenberg')) : null
104 ) : null
105 );
106 }
107
108 var inspector = el(InspectorControls, null,
109 el(PanelBody, { title:__('Logos','blockenberg'), initialOpen:true },
110 logos.map(function(l,i){ return logoRow(l,i); }),
111 el(Button, { variant:'primary', style:{marginTop:'8px',width:'100%'},
112 onClick:function(){ var n={id:uid(),name:'New Partner',imageUrl:'',imageId:0}; setAttr({logos:logos.concat([n])}); setActiveId(n.id); }
113 }, __('+ Add Logo','blockenberg'))
114 ),
115 el(PanelBody, { title:__('Label & Layout','blockenberg'), initialOpen:false },
116 el(ToggleControl, { label:__('Show label','blockenberg'), checked:a.showLabel, onChange:function(v){ setAttr({showLabel:v}); } }),
117 a.showLabel ? el(Fragment, null,
118 el(TextControl, { label:__('Label text','blockenberg'), value:a.label, onChange:function(v){ setAttr({label:v}); } }),
119 el(SelectControl, { label:__('Label position','blockenberg'), value:a.labelPosition, options:[
120 {label:'Top',value:'top'},{label:'Left (inline)',value:'left'}
121 ], onChange:function(v){ setAttr({labelPosition:v}); } })
122 ) : null,
123 el(SelectControl, { label:__('Layout','blockenberg'), value:a.layout, options:[
124 {label:'Flex row (wrap)',value:'flex-row'},
125 {label:'Fixed grid',value:'grid'},
126 ], onChange:function(v){ setAttr({layout:v}); } }),
127 el(RangeControl, { label:__('Columns','blockenberg'), value:a.columns, min:2, max:10, onChange:function(v){ setAttr({columns:v}); } }),
128 el(RangeControl, { label:__('Gap (px)','blockenberg'), value:a.gap, min:8, max:80, onChange:function(v){ setAttr({gap:v}); } }),
129 el(RangeControl, { label:__('Logo height (px)','blockenberg'), value:a.logoHeight, min:20, max:80, onChange:function(v){ setAttr({logoHeight:v}); } }),
130 el(RangeControl, { label:__('Box padding (px)','blockenberg'), value:a.logoPadding, min:0, max:40, onChange:function(v){ setAttr({logoPadding:v}); } }),
131 el(RangeControl, { label:__('Box radius (px)','blockenberg'), value:a.logoRadius, min:0, max:20, onChange:function(v){ setAttr({logoRadius:v}); } }),
132 el(ToggleControl, { label:__('Show box background','blockenberg'), checked:a.showBox, onChange:function(v){ setAttr({showBox:v}); } }),
133 el(ToggleControl, { label:__('Grayscale logos','blockenberg'), checked:a.grayscale, onChange:function(v){ setAttr({grayscale:v}); } }),
134 el(ToggleControl, { label:__('Color on hover','blockenberg'), checked:a.hoverColor, onChange:function(v){ setAttr({hoverColor:v}); } })
135 ),
136 el(PanelBody, { title:__('Spacing','blockenberg'), initialOpen:false },
137 el(RangeControl, { label:__('Padding top (px)','blockenberg'), value:a.paddingTop, min:0, max:160, onChange:function(v){ setAttr({paddingTop:v}); } }),
138 el(RangeControl, { label:__('Padding bottom (px)','blockenberg'), value:a.paddingBottom, min:0, max:160, onChange:function(v){ setAttr({paddingBottom:v}); } })
139 ),
140 el(PanelColorSettings, { title:__('Colors','blockenberg'), initialOpen:false, colorSettings:[
141 {label:__('Section bg','blockenberg'), value:a.sectionBg, onChange:function(v){ setAttr({sectionBg:v||''}); }},
142 {label:__('Label color','blockenberg'),value:a.labelColor, onChange:function(v){ setAttr({labelColor:v||''}); }},
143 {label:__('Logo box bg','blockenberg'),value:a.logoBg, onChange:function(v){ setAttr({logoBg:v||''}); }},
144 {label:__('Logo box border','blockenberg'),value:a.logoBorder, onChange:function(v){ setAttr({logoBorder:v||''}); }},
145 {label:__('Logo tint (grayscale text)','blockenberg'),value:a.logoTint, onChange:function(v){ setAttr({logoTint:v||''}); }},
146 ] }),
147 el(PanelBody, { title: __('Typography', 'blockenberg'), initialOpen: false },
148 el(getTypoControl(), { label: __('Label', 'blockenberg'), value: a.labelTypo, onChange: function (v) { setAttr({ labelTypo: v }); } })
149 ),
150
151 );
152
153 return el(Fragment, null,
154 inspector,
155 el('div', blockProps,
156 a.showLabel && a.labelPosition === 'top' ? labelEl : null,
157 a.showLabel && a.labelPosition === 'left' ? el('div', { className:'bkbg-logg-inline' }, labelEl, grid) : grid,
158 a.showLabel && a.labelPosition !== 'left' ? null : null
159 )
160 );
161 },
162
163 save: function (props) {
164 var a = props.attributes;
165 var _tvFn = window.bkbgTypoCssVars;
166 var s = {
167 '--bkbg-logg-cols':a.columns,'--bkbg-logg-gap':a.gap+'px','--bkbg-logg-h':a.logoHeight+'px','--bkbg-logg-pad':a.logoPadding+'px','--bkbg-logg-r':a.logoRadius+'px','--bkbg-logg-pt':a.paddingTop+'px','--bkbg-logg-pb':a.paddingBottom+'px','--bkbg-logg-label-c':a.labelColor,'--bkbg-logg-bg':a.logoBg,'--bkbg-logg-brd':a.logoBorder,'--bkbg-logg-tint':a.logoTint,background:a.sectionBg||undefined,
168 };
169 if (_tvFn) Object.assign(s, _tvFn(a.labelTypo, '--bkbg-logg-l-'));
170 var blockProps = wp.blockEditor.useBlockProps.save({
171 className:'bkbg-logg-wrap bkbg-logg-layout--'+a.layout, style: s
172 });
173 var labelEl = a.showLabel ? el('p', { className:'bkbg-logg-label bkbg-logg-label--'+a.labelPosition }, a.label) : null;
174 var grid = el('div', { className:'bkbg-logg-grid'+(a.hoverColor&&a.grayscale?' bkbg-logg-hover-color':'') },
175 a.logos.map(function(logo) {
176 return el('div', { key:logo.id, className:'bkbg-logg-item'+(a.showBox?' bkbg-logg-box':'')+(a.grayscale?' bkbg-logg-grayscale':''), title:logo.name },
177 logo.imageUrl ? el('img', { src:logo.imageUrl, alt:logo.name, className:'bkbg-logg-img', loading:'lazy' }) : el('span', { className:'bkbg-logg-text' }, logo.name)
178 );
179 })
180 );
181 return el('div', blockProps,
182 a.labelPosition==='left' ? el('div', { className:'bkbg-logg-inline' }, labelEl, grid) : el(Fragment, null, labelEl, grid)
183 );
184 }
185 });
186 }() );
187