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 / lightbox-gallery / index.js

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

152 lines 6.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 ( function () {
2 const el = window.wp.element.createElement;
3 const { registerBlockType } = window.wp.blocks;
4 const { InspectorControls, MediaUpload, MediaUploadCheck, PanelColorSettings } = window.wp.blockEditor;
5 const { PanelBody, RangeControl, SelectControl, TextControl, ToggleControl, Button } = window.wp.components;
6 const { __ } = window.wp.i18n;
7
8 var _tc, _tv;
9 function getTypoControl() { return _tc || (_tc = window.bkbgTypographyControl); }
10 function getTypoCssVars() { return _tv || (_tv = window.bkbgTypoCssVars); }
11
12 registerBlockType('blockenberg/lightbox-gallery', {
13 edit: function(props) {
14 const { attributes: attr, setAttributes } = props;
15
16 function onSelectImages( mediaItems ) {
17 const images = mediaItems.map( m => ({ id: m.id, url: m.url, alt: m.alt || '', caption: m.caption || '' }) );
18 setAttributes({ images });
19 }
20 function removeImage(idx) {
21 setAttributes({ images: attr.images.filter((_,i)=>i!==idx) });
22 }
23 function updateCaption(idx, caption) {
24 const imgs = attr.images.slice();
25 imgs[idx] = Object.assign({}, imgs[idx], { caption });
26 setAttributes({ images: imgs });
27 }
28
29 const gridStyle = (function () {
30 var _tvFn = getTypoCssVars();
31 var s = {
32 '--bklg-cols': attr.columns,
33 '--bklg-gap': attr.gap + 'px',
34 '--bklg-ratio': attr.imageRatio,
35 '--bklg-radius': attr.borderRadius + 'px',
36 '--bklg-overlay': attr.overlayBg,
37 };
38 if (_tvFn) Object.assign(s, _tvFn(attr.captionTypo, '--bklg-cap-'));
39 return s;
40 })();
41
42 return el('div', {className:'bklg-wrap', style: gridStyle},
43
44 el(InspectorControls, null,
45 el(PanelBody, {title:__('Images'), initialOpen:true},
46 el(MediaUploadCheck, null,
47 el(MediaUpload, {
48 onSelect: onSelectImages,
49 allowedTypes:['image'],
50 multiple: true,
51 gallery: true,
52 value: attr.images.map(i=>i.id),
53 render:({open})=>el(Button, {onClick:open, variant:'primary', style:{width:'100%',justifyContent:'center',marginBottom:'12px'}}, __('Edit Gallery'))
54 })
55 ),
56 attr.showCaptions && attr.images.map((img,i)=>
57 el(TextControl, {key:i, label:__('Caption ') + (i+1), value:img.caption, onChange:v=>updateCaption(i,v)})
58 ),
59 attr.images.map((img,i)=>
60 el('div', {key:i, style:{display:'flex',alignItems:'center',gap:'8px',marginBottom:'4px'}},
61 el('img', {src:img.url, style:{width:48,height:48,objectFit:'cover',borderRadius:'4px'}}),
62 el(Button, {isDestructive:true, isSmall:true, onClick:()=>removeImage(i)}, '')
63 )
64 )
65 ),
66 el(PanelBody, {title:__('Layout'), initialOpen:false},
67 el(RangeControl, {label:__('Columns'), value:attr.columns, min:1, max:6, onChange:v=>setAttributes({columns:v})}),
68 el(RangeControl, {label:__('Gap (px)'), value:attr.gap, min:0, max:48, onChange:v=>setAttributes({gap:v})}),
69 el(RangeControl, {label:__('Border Radius (px)'), value:attr.borderRadius, min:0, max:40, onChange:v=>setAttributes({borderRadius:v})}),
70 el(SelectControl, {
71 label:__('Image Ratio'), value:attr.imageRatio,
72 options:[{label:'Square 1:1',value:'1/1'},{label:'Landscape 4:3',value:'4/3'},{label:'Landscape 16:9',value:'16/9'},{label:'Portrait 3:4',value:'3/4'}],
73 onChange:v=>setAttributes({imageRatio:v})
74 }),
75 el(SelectControl, {
76 label:__('Hover Effect'), value:attr.hoverEffect,
77 options:[{label:'Zoom',value:'zoom'},{label:'Dim',value:'dim'},{label:'None',value:'none'}],
78 onChange:v=>setAttributes({hoverEffect:v})
79 }),
80 el(ToggleControl, {label:__('Show Captions in Lightbox'), checked:attr.showCaptions, onChange:v=>setAttributes({showCaptions:v}), __nextHasNoMarginBottom:true})
81 ),
82 el(PanelColorSettings, {
83 title:__('Colors'), initialOpen:false,
84 colorSettings:[
85 {label:__('Lightbox Overlay'), value:attr.overlayBg, onChange:v=>setAttributes({overlayBg:v||'rgba(0,0,0,0.92)'})},
86 ]
87 }),
88 el(PanelBody, { title: 'Typography', initialOpen: false },
89 getTypoControl() && el(getTypoControl(), { label: __('Caption'), value: attr.captionTypo || {}, onChange: function (v) { setAttributes({ captionTypo: v }); } })
90 ),
91
92 ),
93
94 attr.images.length === 0
95 ? el('div', {className:'bklg-empty'},
96 el(MediaUploadCheck, null,
97 el(MediaUpload, {
98 onSelect:onSelectImages, allowedTypes:['image'], multiple:true, gallery:true, value:[],
99 render:({open})=>el('div', {onClick:open, className:'bklg-placeholder'},
100 el('span', {className:'dashicons dashicons-format-gallery'}),
101 el('p', null, __('Click to add images to the gallery'))
102 )
103 })
104 )
105 )
106 : el('div', {className:'bklg-grid bklg-hover-'+attr.hoverEffect},
107 attr.images.map((img,i)=>
108 el('div', {key:i, className:'bklg-item'},
109 el('div', {className:'bklg-thumb'},
110 el('img', {src:img.url, alt:img.alt, loading:'lazy'})
111 ),
112 attr.showCaptions && img.caption && el('p', {className:'bklg-caption'}, img.caption)
113 )
114 )
115 )
116 );
117 },
118
119 save: function({ attributes: attr }) {
120 const wrapStyle = (function () {
121 var _tvFn = getTypoCssVars();
122 var s = {
123 '--bklg-cols': attr.columns,
124 '--bklg-gap': attr.gap + 'px',
125 '--bklg-ratio': attr.imageRatio,
126 '--bklg-radius': attr.borderRadius + 'px',
127 '--bklg-overlay': attr.overlayBg,
128 };
129 if (_tvFn) Object.assign(s, _tvFn(attr.captionTypo, '--bklg-cap-'));
130 return s;
131 })();
132 return el('div', {
133 className:'bklg-wrap bklg-hover-'+attr.hoverEffect,
134 style: wrapStyle,
135 'data-lightbox': '1',
136 'data-captions': attr.showCaptions ? '1' : '0',
137 },
138 el('div', {className:'bklg-grid'},
139 attr.images.map((img,i)=>
140 el('div', {key:i, className:'bklg-item', 'data-src':img.url, 'data-caption':img.caption||''},
141 el('div', {className:'bklg-thumb'},
142 el('img', {src:img.url, alt:img.alt, loading:'lazy'})
143 ),
144 attr.showCaptions && img.caption && el('p', {className:'bklg-caption'}, img.caption)
145 )
146 )
147 )
148 );
149 }
150 });
151 }() );
152