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 / pdf-embed / index.js

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

376 lines 18.6 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 Fragment = wp.element.Fragment;
4 var __ = wp.i18n.__;
5 var registerBlockType = wp.blocks.registerBlockType;
6 var InspectorControls = wp.blockEditor.InspectorControls;
7 var useBlockProps = wp.blockEditor.useBlockProps;
8 var MediaUpload = wp.blockEditor.MediaUpload;
9 var PanelBody = wp.components.PanelBody;
10 var PanelColorSettings = wp.blockEditor.PanelColorSettings;
11 var Button = wp.components.Button;
12 var ToggleControl = wp.components.ToggleControl;
13 var RangeControl = wp.components.RangeControl;
14 var TextControl = wp.components.TextControl;
15 var SelectControl = wp.components.SelectControl;
16
17 var _tc, _tv;
18 function getTypoControl() { return _tc || (_tc = window.bkbgTypographyControl); }
19 function getTypoCssVars() { return _tv || (_tv = window.bkbgTypoCssVars); }
20
21 var PDFIcon = el('svg', { viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg' },
22 el('path', { d: 'M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6zm4 18H6V4h7v5h5v11zM8 15h2c.55 0 1-.45 1-1v-2c0-.55-.45-1-1-1H8v5h1v-1zm0-3h1v1H8v-1zm4 3h2v-1h-2v-1h2v-1h-2c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1zm5-3h-2v3h1v-1h1c.55 0 1-.45 1-1v-1c0-.55-.45-1-1-1zm0 2h-1v-1h1v1z' })
23 );
24
25 registerBlockType('blockenberg/pdf-embed', {
26 title: __('PDF Embed', 'blockenberg'),
27 description: __('Embed a PDF document with viewer controls.', 'blockenberg'),
28 category: 'bkbg-media',
29 icon: PDFIcon,
30 attributes: {
31 pdfUrl: { type: 'string', default: '' },
32 pdfId: { type: 'number', default: 0 },
33 pdfTitle: { type: 'string', default: 'PDF Document' },
34 height: { type: 'number', default: 600 },
35 width: { type: 'number', default: 100 },
36 showDownload: { type: 'boolean', default: true },
37 downloadLabel: { type: 'string', default: 'Download PDF' },
38 showToolbar: { type: 'boolean', default: true },
39 borderRadius: { type: 'number', default: 8 },
40 borderColor: { type: 'string', default: '#e5e7eb' },
41 borderWidth: { type: 'number', default: 1 },
42 bgColor: { type: 'string', default: '#f9fafb' },
43 downloadBtnBg: { type: 'string', default: '#2563eb' },
44 downloadBtnColor: { type: 'string', default: '#ffffff' },
45 fallbackMessage: { type: 'string', default: 'Your browser does not support inline PDF preview.' },
46 showFallbackLink: { type: 'boolean', default: true },
47 downloadTypo: { type: 'object', default: {} }
48 },
49
50 edit: function (props) {
51 var a = props.attributes;
52 var setAttr = props.setAttributes;
53
54 function getIframeSrc() {
55 if (!a.pdfUrl) return '';
56 return a.showToolbar ? a.pdfUrl : a.pdfUrl + '#toolbar=0';
57 }
58
59 var blockProps = useBlockProps((function(){
60 var s = {
61 '--bkbg-pdf-radius': a.borderRadius + 'px',
62 '--bkbg-pdf-border': a.borderColor,
63 '--bkbg-pdf-bw': a.borderWidth + 'px',
64 '--bkbg-pdf-bg': a.bgColor,
65 '--bkbg-pdf-dl-bg': a.downloadBtnBg,
66 '--bkbg-pdf-dl-clr': a.downloadBtnColor,
67 '--bkbg-pdf-width': a.width + '%'
68 };
69 var tv = getTypoCssVars();
70 if (tv) {
71 Object.assign(s, tv(a.downloadTypo || {}, '--bkbg-pdf-dl'));
72 }
73 return { className: 'bkbg-pdf-wrap', style: s };
74 })());
75
76 var inspector = el(InspectorControls, null,
77
78 el(PanelBody, { title: __('PDF Source', 'blockenberg'), initialOpen: true },
79 el('p', { style: { fontSize: 12, color: '#6b7280', marginTop: 0 } },
80 __('Upload a PDF from the Media Library or enter a URL.', 'blockenberg')
81 ),
82 el(MediaUpload, {
83 onSelect: function (m) {
84 setAttr({ pdfUrl: m.url, pdfId: m.id, pdfTitle: m.title || m.filename || 'PDF Document' });
85 },
86 allowedTypes: ['application/pdf'],
87 value: a.pdfId,
88 render: function (p) {
89 return el(Button, {
90 variant: a.pdfUrl ? 'secondary' : 'primary',
91 onClick: p.open
92 }, a.pdfUrl ? __('Change PDF', 'blockenberg') : __('Upload / Choose PDF', 'blockenberg'));
93 }
94 }),
95 el('div', { style: { margin: '8px 0 4px', fontSize: 12, color: '#6b7280' } }, __('— or enter URL directly —', 'blockenberg')),
96 el(TextControl, {
97 label: __('PDF URL', 'blockenberg'),
98 type: 'url',
99 value: a.pdfUrl,
100 onChange: function (v) { setAttr({ pdfUrl: v }); },
101 placeholder: 'https://example.com/document.pdf'
102 }),
103 a.pdfUrl && el(Button, {
104 variant: 'tertiary', isDestructive: true, isSmall: true,
105 onClick: function () { setAttr({ pdfUrl: '', pdfId: 0 }); }
106 }, __('Remove PDF', 'blockenberg')),
107 el(TextControl, {
108 label: __('Document title (for accessibility)', 'blockenberg'),
109 value: a.pdfTitle,
110 onChange: function (v) { setAttr({ pdfTitle: v }); }
111 })
112 ),
113
114 el(PanelBody, { title: __('Display', 'blockenberg'), initialOpen: false },
115 el(RangeControl, {
116 label: __('Height (px)', 'blockenberg'),
117 value: a.height, min: 200, max: 1600,
118 onChange: function (v) { setAttr({ height: v }); }
119 }),
120 el(RangeControl, {
121 label: __('Width (%)', 'blockenberg'),
122 value: a.width, min: 40, max: 100,
123 onChange: function (v) { setAttr({ width: v }); }
124 }),
125 el(ToggleControl, {
126 label: __('Show PDF toolbar', 'blockenberg'),
127 checked: a.showToolbar,
128 onChange: function (v) { setAttr({ showToolbar: v }); },
129 __nextHasNoMarginBottom: true
130 }),
131 el(RangeControl, {
132 label: __('Border radius (px)', 'blockenberg'),
133 value: a.borderRadius, min: 0, max: 24,
134 onChange: function (v) { setAttr({ borderRadius: v }); }
135 }),
136 el(RangeControl, {
137 label: __('Border width (px)', 'blockenberg'),
138 value: a.borderWidth, min: 0, max: 8,
139 onChange: function (v) { setAttr({ borderWidth: v }); }
140 })
141 ),
142
143 el(PanelBody, { title: __('Download Button', 'blockenberg'), initialOpen: false },
144 el(ToggleControl, {
145 label: __('Show download button', 'blockenberg'),
146 checked: a.showDownload,
147 onChange: function (v) { setAttr({ showDownload: v }); },
148 __nextHasNoMarginBottom: true
149 }),
150 a.showDownload && el(TextControl, {
151 label: __('Button label', 'blockenberg'),
152 value: a.downloadLabel,
153 onChange: function (v) { setAttr({ downloadLabel: v }); }
154 })
155 ),
156
157 el(PanelBody, { title: __('Fallback', 'blockenberg'), initialOpen: false },
158 el(TextControl, {
159 label: __('Fallback message', 'blockenberg'),
160 value: a.fallbackMessage,
161 onChange: function (v) { setAttr({ fallbackMessage: v }); }
162 }),
163 el(ToggleControl, {
164 label: __('Show fallback download link', 'blockenberg'),
165 checked: a.showFallbackLink,
166 onChange: function (v) { setAttr({ showFallbackLink: v }); },
167 __nextHasNoMarginBottom: true
168 })
169 ),
170
171 el(PanelBody, { title: __('Typography', 'blockenberg'), initialOpen: false },
172 (function(){ var C = getTypoControl(); return C ? [
173 el(C, { key: 'download', label: __('Download Button', 'blockenberg'), value: a.downloadTypo || {}, onChange: function(v){ setAttr({downloadTypo: v}); } })
174 ] : null; })()
175 ),
176 el(PanelBody, { title: __('Colors', 'blockenberg'), initialOpen: false },
177 el(PanelColorSettings, {
178 title: __('Colors', 'blockenberg'),
179 initialOpen: false,
180 colorSettings: [
181 { label: __('Frame background', 'blockenberg'), value: a.bgColor, onChange: function(v){ setAttr({ bgColor: v||'#f9fafb' }); } },
182 { label: __('Border', 'blockenberg'), value: a.borderColor, onChange: function(v){ setAttr({ borderColor: v||'#e5e7eb' }); } },
183 { label: __('Download button bg', 'blockenberg'), value: a.downloadBtnBg, onChange: function(v){ setAttr({ downloadBtnBg: v||'#2563eb' }); } },
184 { label: __('Download button text', 'blockenberg'),value: a.downloadBtnColor,onChange: function(v){ setAttr({ downloadBtnColor: v||'#ffffff' }); } }
185 ]
186 })
187 )
188 );
189
190 /* ── Editor preview ── */
191 var preview;
192 if (!a.pdfUrl) {
193 preview = el('div', { className: 'bkbg-pdf-placeholder' },
194 el('div', { className: 'bkbg-pdf-placeholder-icon' }, PDFIcon),
195 el('p', null, __('Upload or paste a PDF URL in the settings panel.', 'blockenberg')),
196 el(MediaUpload, {
197 onSelect: function (m) {
198 setAttr({ pdfUrl: m.url, pdfId: m.id, pdfTitle: m.title || 'PDF Document' });
199 },
200 allowedTypes: ['application/pdf'],
201 value: a.pdfId,
202 render: function (p) {
203 return el(Button, { variant: 'primary', onClick: p.open }, __('Upload PDF', 'blockenberg'));
204 }
205 })
206 );
207 } else {
208 var iframeSrc = getIframeSrc();
209 preview = el(Fragment, null,
210 el('div', { className: 'bkbg-pdf-viewer', style: { height: Math.min(a.height, 400) + 'px' } },
211 el('iframe', {
212 src: iframeSrc,
213 title: a.pdfTitle,
214 className: 'bkbg-pdf-iframe',
215 style: { pointerEvents: 'none' }
216 })
217 ),
218 a.showDownload && el('div', { className: 'bkbg-pdf-footer' },
219 el('a', {
220 href: a.pdfUrl,
221 download: '',
222 className: 'bkbg-pdf-download'
223 },
224 el('svg', { viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg', className: 'bkbg-pdf-dl-icon' },
225 el('path', { d: 'M12 16l-5-5h3V4h4v7h3l-5 5zm-7 4v-2h14v2H5z' })
226 ),
227 a.downloadLabel
228 )
229 )
230 );
231 }
232
233 return el(Fragment, null,
234 inspector,
235 el('div', blockProps, preview)
236 );
237 },
238
239 deprecated: [{
240 attributes: {
241 pdfUrl: { type: 'string', default: '' },
242 pdfId: { type: 'number', default: 0 },
243 pdfTitle: { type: 'string', default: 'PDF Document' },
244 height: { type: 'number', default: 600 },
245 width: { type: 'number', default: 100 },
246 showDownload: { type: 'boolean', default: true },
247 downloadLabel: { type: 'string', default: 'Download PDF' },
248 showToolbar: { type: 'boolean', default: true },
249 borderRadius: { type: 'number', default: 8 },
250 borderColor: { type: 'string', default: '#e5e7eb' },
251 borderWidth: { type: 'number', default: 1 },
252 bgColor: { type: 'string', default: '#f9fafb' },
253 downloadBtnBg: { type: 'string', default: '#2563eb' },
254 downloadBtnColor: { type: 'string', default: '#ffffff' },
255 fallbackMessage: { type: 'string', default: 'Your browser does not support inline PDF preview.' },
256 showFallbackLink: { type: 'boolean', default: true },
257 downloadFontSize: { type: 'number', default: 14 },
258 downloadFontWeight: { type: 'string', default: '600' }
259 },
260 save: function(props) {
261 var a = props.attributes;
262 var blockProps = wp.blockEditor.useBlockProps.save({
263 className: 'bkbg-pdf-wrap',
264 style: {
265 '--bkbg-pdf-radius': a.borderRadius + 'px',
266 '--bkbg-pdf-border': a.borderColor,
267 '--bkbg-pdf-bw': a.borderWidth + 'px',
268 '--bkbg-pdf-bg': a.bgColor,
269 '--bkbg-pdf-dl-bg': a.downloadBtnBg,
270 '--bkbg-pdf-dl-clr': a.downloadBtnColor,
271 '--bkbg-pdf-width': a.width + '%'
272 }
273 });
274 if (!a.pdfUrl) {
275 return el('div', blockProps,
276 el('p', { className: 'bkbg-pdf-no-source' }, 'No PDF selected.')
277 );
278 }
279 var iframeSrc = a.showToolbar ? a.pdfUrl : a.pdfUrl + '#toolbar=0';
280 return el('div', blockProps,
281 el('div', {
282 className: 'bkbg-pdf-viewer',
283 style: { height: a.height + 'px' }
284 },
285 el('iframe', {
286 src: iframeSrc,
287 title: a.pdfTitle,
288 className: 'bkbg-pdf-iframe',
289 loading: 'lazy'
290 },
291 el('p', { className: 'bkbg-pdf-fallback' },
292 a.fallbackMessage + ' ',
293 a.showFallbackLink && el('a', { href: a.pdfUrl, download: '' }, 'Download PDF')
294 )
295 )
296 ),
297 a.showDownload && el('div', { className: 'bkbg-pdf-footer' },
298 el('a', {
299 href: a.pdfUrl,
300 download: '',
301 className: 'bkbg-pdf-download',
302 target: '_blank',
303 rel: 'noopener'
304 },
305 el('svg', { viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg', className: 'bkbg-pdf-dl-icon' },
306 el('path', { d: 'M12 16l-5-5h3V4h4v7h3l-5 5zm-7 4v-2h14v2H5z' })
307 ),
308 a.downloadLabel
309 )
310 )
311 );
312 }
313 }],
314
315 save: function (props) {
316 var a = props.attributes;
317 var tv = getTypoCssVars();
318 var s = {
319 '--bkbg-pdf-radius': a.borderRadius + 'px',
320 '--bkbg-pdf-border': a.borderColor,
321 '--bkbg-pdf-bw': a.borderWidth + 'px',
322 '--bkbg-pdf-bg': a.bgColor,
323 '--bkbg-pdf-dl-bg': a.downloadBtnBg,
324 '--bkbg-pdf-dl-clr': a.downloadBtnColor,
325 '--bkbg-pdf-width': a.width + '%'
326 };
327 if (tv) { Object.assign(s, tv(a.downloadTypo || {}, '--bkbg-pdf-dl')); }
328 var blockProps = wp.blockEditor.useBlockProps.save({
329 className: 'bkbg-pdf-wrap',
330 style: s
331 });
332
333 if (!a.pdfUrl) {
334 return el('div', blockProps,
335 el('p', { className: 'bkbg-pdf-no-source' }, 'No PDF selected.')
336 );
337 }
338
339 var iframeSrc = a.showToolbar ? a.pdfUrl : a.pdfUrl + '#toolbar=0';
340
341 return el('div', blockProps,
342 el('div', {
343 className: 'bkbg-pdf-viewer',
344 style: { height: a.height + 'px' }
345 },
346 el('iframe', {
347 src: iframeSrc,
348 title: a.pdfTitle,
349 className: 'bkbg-pdf-iframe',
350 loading: 'lazy'
351 },
352 el('p', { className: 'bkbg-pdf-fallback' },
353 a.fallbackMessage + ' ',
354 a.showFallbackLink && el('a', { href: a.pdfUrl, download: '' }, 'Download PDF')
355 )
356 )
357 ),
358 a.showDownload && el('div', { className: 'bkbg-pdf-footer' },
359 el('a', {
360 href: a.pdfUrl,
361 download: '',
362 className: 'bkbg-pdf-download',
363 target: '_blank',
364 rel: 'noopener'
365 },
366 el('svg', { viewBox: '0 0 24 24', xmlns: 'http://www.w3.org/2000/svg', className: 'bkbg-pdf-dl-icon' },
367 el('path', { d: 'M12 16l-5-5h3V4h4v7h3l-5 5zm-7 4v-2h14v2H5z' })
368 ),
369 a.downloadLabel
370 )
371 )
372 );
373 }
374 });
375 }() );
376