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 / perspective-device / index.js

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

222 lines 13.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ====================================================
2 Perspective Device — editor (index.js)
3 Block: blockenberg/perspective-device
4 ==================================================== */
5 ( function () {
6 var el = wp.element.createElement;
7 var Fragment = wp.element.Fragment;
8 var MediaUpload = wp.blockEditor.MediaUpload;
9 var MediaUploadCheck = wp.blockEditor.MediaUploadCheck;
10 var registerBlockType = wp.blocks.registerBlockType;
11 var InspectorControls = wp.blockEditor.InspectorControls;
12 var useBlockProps = wp.blockEditor.useBlockProps;
13 var PanelColorSettings = wp.blockEditor.PanelColorSettings;
14 var PanelBody = wp.components.PanelBody;
15 var RangeControl = wp.components.RangeControl;
16 var SelectControl = wp.components.SelectControl;
17 var ToggleControl = wp.components.ToggleControl;
18 var TextControl = wp.components.TextControl;
19 var Button = wp.components.Button;
20 var __ = wp.i18n.__;
21
22 function wrapStyle(a) {
23 return {
24 '--bkbg-pdev-pt': a.paddingTop+'px',
25 '--bkbg-pdev-pb': a.paddingBottom+'px',
26 '--bkbg-pdev-frame-c': a.frameColor || undefined,
27 '--bkbg-pdev-screen-bg': a.screenBg,
28 background: a.sectionBg || undefined,
29 };
30 }
31
32 /* Build device frame element */
33 function DeviceFrame(props) {
34 var a = props.a;
35 var isEdit = props.isEdit;
36 var openMedia = props.openMedia;
37
38 var screenContent = a.screenshotUrl
39 ? el('img', { src:a.screenshotUrl, alt:a.screenshotAlt, className:'bkbg-pdev-screenshot', loading:'lazy' })
40 : el('div', { className:'bkbg-pdev-placeholder' },
41 el('span', { style:{fontSize:'48px'} }, '🖼️'),
42 isEdit ? el('p', { style:{color:'#94a3b8',fontSize:'13px',marginTop:'8px'} }, __('Click to upload screenshot','blockenberg')) : null
43 );
44
45 if (a.deviceType === 'browser') {
46 return el('div', { className:'bkbg-pdev-device bkbg-pdev-device--browser' + (a.showShadow?' bkbg-pdev-device--shadow':'') },
47 el('div', { className:'bkbg-pdev-browser-bar' },
48 el('div', { className:'bkbg-pdev-dots' },
49 el('span'), el('span'), el('span')
50 ),
51 el('div', { className:'bkbg-pdev-url-bar' })
52 ),
53 el('div', { className:'bkbg-pdev-screen', onClick: isEdit&&!a.screenshotUrl ? openMedia : undefined },
54 screenContent
55 ),
56 a.showReflection ? el('div', { className:'bkbg-pdev-reflection' }) : null
57 );
58 }
59
60 if (a.deviceType === 'phone') {
61 return el('div', { className:'bkbg-pdev-device bkbg-pdev-device--phone' + (a.showShadow?' bkbg-pdev-device--shadow':'') },
62 el('div', { className:'bkbg-pdev-phone-notch' }),
63 el('div', { className:'bkbg-pdev-screen', onClick: isEdit&&!a.screenshotUrl ? openMedia : undefined },
64 screenContent
65 ),
66 el('div', { className:'bkbg-pdev-phone-home' })
67 );
68 }
69
70 if (a.deviceType === 'tablet') {
71 return el('div', { className:'bkbg-pdev-device bkbg-pdev-device--tablet' + (a.showShadow?' bkbg-pdev-device--shadow':'') },
72 el('div', { className:'bkbg-pdev-tablet-cam' }),
73 el('div', { className:'bkbg-pdev-screen', onClick: isEdit&&!a.screenshotUrl ? openMedia : undefined },
74 screenContent
75 ),
76 el('div', { className:'bkbg-pdev-tablet-home' })
77 );
78 }
79
80 /* laptop */
81 return el('div', { className:'bkbg-pdev-device bkbg-pdev-device--laptop' + (a.showShadow?' bkbg-pdev-device--shadow':'') },
82 el('div', { className:'bkbg-pdev-laptop-lid' },
83 el('div', { className:'bkbg-pdev-laptop-cam' }),
84 el('div', { className:'bkbg-pdev-screen', onClick: isEdit&&!a.screenshotUrl ? openMedia : undefined },
85 screenContent
86 )
87 ),
88 el('div', { className:'bkbg-pdev-laptop-base' },
89 el('div', { className:'bkbg-pdev-laptop-keyboard' }),
90 el('div', { className:'bkbg-pdev-laptop-trackpad' })
91 )
92 );
93 }
94
95 registerBlockType('blockenberg/perspective-device', {
96 edit: function (props) {
97 var a = props.attributes;
98 var setAttr = props.setAttributes;
99
100 var blockProps = useBlockProps({
101 className: 'bkbg-pdev-wrap bkbg-pdev-persp--' + a.perspective + ' bkbg-pdev-theme--' + a.deviceTheme,
102 style: wrapStyle(a)
103 });
104
105 var inspector = el(InspectorControls, null,
106 el(PanelBody, { title:__('Screenshot','blockenberg'), initialOpen:true },
107 el(MediaUploadCheck, null,
108 el(MediaUpload, {
109 onSelect:function(m){ setAttr({screenshotUrl:m.url,screenshotId:m.id}); },
110 allowedTypes:['image'], value:a.screenshotId,
111 render:function(o){ return el(Button, { onClick:o.open, variant:'secondary' }, a.screenshotUrl ? __('Change screenshot','blockenberg') : __('Upload screenshot','blockenberg')); }
112 })
113 ),
114 a.screenshotUrl ? el(Button, { isDestructive:true, variant:'tertiary', isSmall:true, style:{marginTop:'4px'}, onClick:function(){ setAttr({screenshotUrl:'',screenshotId:0}); } }, __('Remove image','blockenberg')) : null,
115 el(TextControl, { label:__('Alt text','blockenberg'), value:a.screenshotAlt, onChange:function(v){ setAttr({screenshotAlt:v}); } })
116 ),
117 el(PanelBody, { title:__('Device','blockenberg'), initialOpen:false },
118 el(SelectControl, { label:__('Device type','blockenberg'), value:a.deviceType, options:[
119 {label:'Browser window', value:'browser'},
120 {label:'Phone', value:'phone'},
121 {label:'Tablet', value:'tablet'},
122 {label:'Laptop', value:'laptop'},
123 ], onChange:function(v){ setAttr({deviceType:v}); } }),
124 el(SelectControl, { label:__('Perspective','blockenberg'), value:a.perspective, options:[
125 {label:'Flat', value:'flat'},
126 {label:'Tilt left', value:'tilt-left'},
127 {label:'Tilt right', value:'tilt-right'},
128 {label:'Float (animated)', value:'float'},
129 ], onChange:function(v){ setAttr({perspective:v}); } }),
130 el(SelectControl, { label:__('Device theme','blockenberg'), value:a.deviceTheme, options:[
131 {label:'Light', value:'light'},
132 {label:'Dark', value:'dark'},
133 ], onChange:function(v){ setAttr({deviceTheme:v}); } }),
134 el(ToggleControl, { label:__('Show shadow','blockenberg'), checked:a.showShadow, onChange:function(v){ setAttr({showShadow:v}); } }),
135 el(ToggleControl, { label:__('Show reflection','blockenberg'), checked:a.showReflection, onChange:function(v){ setAttr({showReflection:v}); } }),
136 el(RangeControl, { label:__('Max width (px)','blockenberg'), value:a.maxWidth, min:320, max:1300, onChange:function(v){ setAttr({maxWidth:v}); } }),
137 el(SelectControl, { label:__('Alignment','blockenberg'), value:a.align, options:[
138 {label:'Left', value:'left'},
139 {label:'Center', value:'center'},
140 {label:'Right', value:'right'},
141 ], onChange:function(v){ setAttr({align:v}); } })
142 ),
143 el(PanelBody, { title:__('Spacing','blockenberg'), initialOpen:false },
144 el(RangeControl, { label:__('Padding top (px)','blockenberg'), value:a.paddingTop, min:0, max:160, onChange:function(v){ setAttr({paddingTop:v}); } }),
145 el(RangeControl, { label:__('Padding bottom (px)','blockenberg'), value:a.paddingBottom, min:0, max:160, onChange:function(v){ setAttr({paddingBottom:v}); } })
146 ),
147 el(PanelColorSettings, { title:__('Colors','blockenberg'), initialOpen:false, colorSettings:[
148 {label:__('Section bg','blockenberg'), value:a.sectionBg, onChange:function(v){ setAttr({sectionBg:v||''}); }},
149 {label:__('Frame color','blockenberg'), value:a.frameColor, onChange:function(v){ setAttr({frameColor:v||''}); }},
150 {label:__('Screen bg','blockenberg'), value:a.screenBg, onChange:function(v){ setAttr({screenBg:v||''}); }},
151 ] })
152 );
153
154 var alignJustify = a.align==='center' ? 'center' : a.align==='right' ? 'flex-end' : 'flex-start';
155
156 return el(Fragment, null,
157 inspector,
158 el('div', blockProps,
159 el('div', { className:'bkbg-pdev-inner', style:{maxWidth:a.maxWidth+'px',margin:'0 auto',display:'flex',justifyContent:alignJustify} },
160 el(MediaUploadCheck, null,
161 el(MediaUpload, {
162 onSelect:function(m){ setAttr({screenshotUrl:m.url,screenshotId:m.id}); },
163 allowedTypes:['image'], value:a.screenshotId,
164 render:function(o){
165 return el(DeviceFrame, { a:a, isEdit:true, openMedia:o.open });
166 }
167 })
168 )
169 )
170 )
171 );
172 },
173
174 save: function (props) {
175 var a = props.attributes;
176 var blockProps = wp.blockEditor.useBlockProps.save({
177 className:'bkbg-pdev-wrap bkbg-pdev-persp--'+a.perspective+' bkbg-pdev-theme--'+a.deviceTheme,
178 style:{
179 '--bkbg-pdev-pt':a.paddingTop+'px','--bkbg-pdev-pb':a.paddingBottom+'px','--bkbg-pdev-frame-c':a.frameColor||undefined,'--bkbg-pdev-screen-bg':a.screenBg,background:a.sectionBg||undefined,
180 }
181 });
182 var alignJustify = a.align==='center'?'center':a.align==='right'?'flex-end':'flex-start';
183
184 var screenEl = a.screenshotUrl
185 ? el('img', { src:a.screenshotUrl, alt:a.screenshotAlt, className:'bkbg-pdev-screenshot', loading:'lazy' })
186 : el('div', { className:'bkbg-pdev-placeholder' });
187
188 var deviceEl;
189 if (a.deviceType === 'browser') {
190 deviceEl = el('div', { className:'bkbg-pdev-device bkbg-pdev-device--browser'+(a.showShadow?' bkbg-pdev-device--shadow':'') },
191 el('div', { className:'bkbg-pdev-browser-bar' }, el('div', { className:'bkbg-pdev-dots' }, el('span'), el('span'), el('span')), el('div', { className:'bkbg-pdev-url-bar' })),
192 el('div', { className:'bkbg-pdev-screen' }, screenEl),
193 a.showReflection ? el('div', { className:'bkbg-pdev-reflection' }) : null
194 );
195 } else if (a.deviceType === 'phone') {
196 deviceEl = el('div', { className:'bkbg-pdev-device bkbg-pdev-device--phone'+(a.showShadow?' bkbg-pdev-device--shadow':'') },
197 el('div', { className:'bkbg-pdev-phone-notch' }),
198 el('div', { className:'bkbg-pdev-screen' }, screenEl),
199 el('div', { className:'bkbg-pdev-phone-home' })
200 );
201 } else if (a.deviceType === 'tablet') {
202 deviceEl = el('div', { className:'bkbg-pdev-device bkbg-pdev-device--tablet'+(a.showShadow?' bkbg-pdev-device--shadow':'') },
203 el('div', { className:'bkbg-pdev-tablet-cam' }),
204 el('div', { className:'bkbg-pdev-screen' }, screenEl),
205 el('div', { className:'bkbg-pdev-tablet-home' })
206 );
207 } else {
208 deviceEl = el('div', { className:'bkbg-pdev-device bkbg-pdev-device--laptop'+(a.showShadow?' bkbg-pdev-device--shadow':'') },
209 el('div', { className:'bkbg-pdev-laptop-lid' }, el('div', { className:'bkbg-pdev-laptop-cam' }), el('div', { className:'bkbg-pdev-screen' }, screenEl)),
210 el('div', { className:'bkbg-pdev-laptop-base' }, el('div', { className:'bkbg-pdev-laptop-keyboard' }), el('div', { className:'bkbg-pdev-laptop-trackpad' }))
211 );
212 }
213
214 return el('div', blockProps,
215 el('div', { className:'bkbg-pdev-inner', style:{maxWidth:a.maxWidth+'px',margin:'0 auto',display:'flex',justifyContent:alignJustify} },
216 deviceEl
217 )
218 );
219 }
220 });
221 }() );
222