From 028d59514486341ec1999bf774cbf28930957031 Mon Sep 17 00:00:00 2001 From: Daniel Reintanz <85614916+FreelancerAMP@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:43:20 +0200 Subject: [PATCH] ADDED Code of Version 2.0.0 of the Advanced Composer Blocks for Newsletter Plugin --- README.txt | 81 +++++++++ blocks/mbtnp-cover/block.php | 160 +++++++++++++++++ blocks/mbtnp-cover/icon.png | Bin 0 -> 5303 bytes blocks/mbtnp-cover/options.php | 64 +++++++ blocks/mbtnp-cta/block.php | 59 ++++++ blocks/mbtnp-cta/icon.png | Bin 0 -> 6814 bytes blocks/mbtnp-cta/options.php | 39 ++++ blocks/mbtnp-image/block.php | 110 ++++++++++++ blocks/mbtnp-image/icon.png | Bin 0 -> 6225 bytes blocks/mbtnp-image/options.php | 53 ++++++ blocks/mbtnp-posts-list/block.php | 223 +++++++++++++++++++++++ blocks/mbtnp-posts-list/icon.png | Bin 0 -> 5642 bytes blocks/mbtnp-posts-list/options.php | 246 +++++++++++++++++++++++++ blocks/mbtnp-single-post/block.php | 234 ++++++++++++++++++++++++ blocks/mbtnp-single-post/icon.png | Bin 0 -> 6833 bytes blocks/mbtnp-single-post/options.php | 248 ++++++++++++++++++++++++++ blocks/mbtnp-text/block.php | 96 ++++++++++ blocks/mbtnp-text/icon.png | Bin 0 -> 4244 bytes blocks/mbtnp-text/options.php | 83 +++++++++ css/mbtnp-blocks-copy-paste-block.css | 39 ++++ images/icon-copy.png | Bin 0 -> 1978 bytes images/icon-paste.png | Bin 0 -> 1979 bytes images/placeholder-image.jpg | Bin 0 -> 47268 bytes inc/menus.php | 77 ++++++++ js/mbtnp-blocks-copy-paste-block.js | 171 ++++++++++++++++++ js/mbtnp-blocks-live-preview.js | 26 +++ mbtnp-blocks.php | 150 ++++++++++++++++ styles.css | 28 +++ 28 files changed, 2187 insertions(+) create mode 100644 README.txt create mode 100644 blocks/mbtnp-cover/block.php create mode 100644 blocks/mbtnp-cover/icon.png create mode 100644 blocks/mbtnp-cover/options.php create mode 100644 blocks/mbtnp-cta/block.php create mode 100644 blocks/mbtnp-cta/icon.png create mode 100644 blocks/mbtnp-cta/options.php create mode 100644 blocks/mbtnp-image/block.php create mode 100644 blocks/mbtnp-image/icon.png create mode 100644 blocks/mbtnp-image/options.php create mode 100644 blocks/mbtnp-posts-list/block.php create mode 100644 blocks/mbtnp-posts-list/icon.png create mode 100644 blocks/mbtnp-posts-list/options.php create mode 100644 blocks/mbtnp-single-post/block.php create mode 100644 blocks/mbtnp-single-post/icon.png create mode 100644 blocks/mbtnp-single-post/options.php create mode 100644 blocks/mbtnp-text/block.php create mode 100644 blocks/mbtnp-text/icon.png create mode 100644 blocks/mbtnp-text/options.php create mode 100644 css/mbtnp-blocks-copy-paste-block.css create mode 100644 images/icon-copy.png create mode 100644 images/icon-paste.png create mode 100644 images/placeholder-image.jpg create mode 100644 inc/menus.php create mode 100644 js/mbtnp-blocks-copy-paste-block.js create mode 100644 js/mbtnp-blocks-live-preview.js create mode 100644 mbtnp-blocks.php create mode 100644 styles.css diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b4c35a8 --- /dev/null +++ b/README.txt @@ -0,0 +1,81 @@ +=== Advanced Composer Blocks for Newsletter === +Contributors: mdburnette +Tags: email, newsletter, composer, blocks +License: GPLv2 or later +Requires at least: 6.0 +Tested up to: 6.7 +Requires PHP: 7.0 +Stable tag: 2.0.0 + +A set of enhanced composer blocks and additional settings to extend The Newsletter Plugin. + +== Description == +The WordPress plugin that lets you craft modern email newsletters with custom fields and new design options. + +With upgraded blocks and custom field functionality, Advanced Composer Blocks elevates your newsletter with design and content options not available anywhere else for the Newsletter plugin. + +NOTE: Requires at least free version of the [Newsletter](https://wordpress.org/plugins/newsletter/) plugin. + +## Plugin features: + +- 6 new, feature-packed blocks - Six additional, advanced composer blocks open up a ton of new design and content options. +- Composer editing enhancement - Make testing your newsletters even easier with the "Live Preview" button that allows you to quickly preview your email newsletter in a new tab. +- Composer editing enhancement - Make crafting your newsletters faster with composer block "COPY" and "PASTE" features - which allows you to duplicate blocks between emails as well! +- WordPress custom field tags - Take advantage of the custom fields you already have to further simplify creating post listings. + +## Blocks included: + +- Text+ [Watch demo video](https://youtu.be/Im6x9rhhYqs) +- Image+ [Watch demo video](https://youtu.be/bbLuWLMpkms) +- Posts List [Watch demo video](https://youtu.be/IgBt_GlWT6w) +- Cover [Watch demo video](https://youtu.be/xl7HzM2PmXE) +- Call to Action+ [Watch demo video](https://youtu.be/cW2Am-ehr0c) +- Single Post+ [Watch demo video](https://youtu.be/8s4DFUUJ4NI) + +== Screenshots == +1. Included composer blocks, each with a distinct dark blue icon +2. Font, color, and layout options for the Posts List block +3. Example of Text+ block and options +4. Cover block with image upload, overlay, and layout options + +== Changelog == +→ 11.29.24 - 2.0.0 +- Rolled premium features into the free version, discontinued paid offering + +→ 06.26.24 - 1.3.2 +- Fixed issue with copy/paste links showing in final email + +→ 06.24.24 - 1.3.1 +- Fixed CSS nesting issue +- Updated Freemius SDK to 2.7.2 + +→ 06.24.24 - 1.3.0 +- Added ability to copy/paste blocks between emails + +→ 04.11.24 - 1.2.0 +- Fixed double-declaring of a function +- Misc typos + +→ 03.23.24 - 1.1.1 +- Additional cleanup for inclusion in the WordPress.org repo + +→ 03.13.24 - 1.1 +- Lots of PHP cleanup for inclusion in the WordPress.org repo + +→ 01.26.24 - 1.0.4 +- Added free version of plugin with Posts List and Image+ as free blocks! +- Updates to be WordPress.org repository compliant +- Fixed Posts List thumbnail showing by default + +→ 01.18.24 - 1.0.3 +- Fixed Single Post+ button hiding not working. + +→ 01.18.24 - 1.0.2 +- Fixed naming of a couple of blocks. + +→ 01.17.24 - 1.0.1 +- Removed "row gap" option from Single Post+ (not needed). +- Changed how custom field tags are used and updated instructions. + +→ 01.16.24 - 1.0.0 +- Initial soft release. \ No newline at end of file diff --git a/blocks/mbtnp-cover/block.php b/blocks/mbtnp-cover/block.php new file mode 100644 index 0000000..a9ff8f4 --- /dev/null +++ b/blocks/mbtnp-cover/block.php @@ -0,0 +1,160 @@ + 'Cover Title', + 'title_font_family' => '', + 'title_font_size' => '', + 'title_font_weight' => '', + 'title_font_color' => '', + 'title_font_align' => 'center', + 'text' => 'Cover block text (optional)', + 'font_family' => '', + 'font_size' => '', + 'font_weight' => '', + 'font_color' => '', + 'overlay-opacity' => 50, + 'padding-top' => 40, + 'padding-bottom' => 40, + 'padding-left' => 40, + 'padding-right' => 40, + 'block_padding_top' => 30, + 'block_padding_bottom' => 30, + 'block_padding_left' => 0, + 'block_padding_right' => 0, + 'block_background' => '', +); + +$options = array_merge($defaults, $options); + +$title_style = TNP_Composer::get_title_style($options, 'title', $composer); +$text_style = TNP_Composer::get_text_style($options, '', $composer); + +$media = false; + +if ( !empty($options['image']['id']) ) { + $td_width = round(($composer['width'] - $options['block_padding_left'] - $options['block_padding_right'] - 20) / 2); + //$image_width = 300 - $options['block_padding_left']; + $media = tnp_resize_2x( $options['image']['id'], [$td_width, 0] ); +} ?> + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ +
+
\ No newline at end of file diff --git a/blocks/mbtnp-cover/icon.png b/blocks/mbtnp-cover/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..405c5db599dfd8a0bf0d82043992b8c3ef1bcd1b GIT binary patch literal 5303 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 literal 0 HcmV?d00001 diff --git a/blocks/mbtnp-cover/options.php b/blocks/mbtnp-cover/options.php new file mode 100644 index 0000000..70a8684 --- /dev/null +++ b/blocks/mbtnp-cover/options.php @@ -0,0 +1,64 @@ + + +hidden('image_url') ?> + +media('image', __('Image', 'advanced-composer-blocks-for-newsletter'), array('alt' => false)) ?> + +
+
+ color('overlay-color', __('Overlay color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ number('overlay-opacity', __('Overlay opacity', 'advanced-composer-blocks-for-newsletter'), array('min' => 0, 'max' => 100)) ?> + +
+
+ size('border-radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +text('title', __('Title', 'advanced-composer-blocks-for-newsletter')) ?> +font('title_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> + +textarea('text', __('Text', 'advanced-composer-blocks-for-newsletter')) ?> +font( 'font', '', [ 'family_default' => true, 'size_default' => true, 'weight_default' => true, 'align'=>true ] ) ?> + +
+
+

Padding

+ + + + + + +
size('padding-left', __('← Left', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-top', __('↑ Top', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-bottom', __('↓ Bottom', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-right', __('→ Right', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+
+

Box shadow

+ + + + + + + + +
color('box-shadow-color', __('Color', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-x', __('↔ X-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-y', __('↕ Y-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-blur', __('Blur', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-spread', __('Spread', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+ +block_commons() ?> \ No newline at end of file diff --git a/blocks/mbtnp-cta/block.php b/blocks/mbtnp-cta/block.php new file mode 100644 index 0000000..f7efa36 --- /dev/null +++ b/blocks/mbtnp-cta/block.php @@ -0,0 +1,59 @@ + 'Learn more', + 'button_url' => '', + 'button_color' => '#000000', + 'button_border_radius' => '3', + 'text_color' => '#ffffff', + 'align' => 'center', + 'block_background' => '', + 'button_width' => 'inline', + 'button_align' => 'center', + 'block_padding_top' => 20, + 'block_padding_bottom' => 20, + 'schema' => '' +); + +$options = array_merge($default_options, $options); + +$text_style = TNP_Composer::get_style($options, 'button_text', $composer, 'text'); +?> + + + + + + + +
+ +
\ No newline at end of file diff --git a/blocks/mbtnp-cta/icon.png b/blocks/mbtnp-cta/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4be4c9ebec3aec53f307f2d3fdb265fe3353f8cd GIT binary patch literal 6814 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 d2f}Ya-@l!ec|DuQ`Rm3=8= + +text('button_text', __('Button text', 'advanced-composer-blocks-for-newsletter')) ?> +font('button_text_font', '', [ 'family_default' => true, 'size_default' => true, 'weight_default' => true, 'align'=>false, 'color'=>false ] ) ?> + +url('button_url', __('Button link URL', 'advanced-composer-blocks-for-newsletter') ) ?> + + +
+
+ color('text_color', __('Text color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('button_color', __('Button color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('button_border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+ select('button_width', 'Width', ['inline' => __('Inline'), 'full_width' => __('Full width')]) ?> +
+
+ select('button_align', 'Alignment', ['center' => __('Center'), 'left' => __('Left'), 'right' => __('Right')]) ?> +
+
+ +
+ +block_commons() ?> diff --git a/blocks/mbtnp-image/block.php b/blocks/mbtnp-image/block.php new file mode 100644 index 0000000..6a1ad8a --- /dev/null +++ b/blocks/mbtnp-image/block.php @@ -0,0 +1,110 @@ + '', + 'image-alt' => '', + 'url' => '', + 'width' => 0, + 'border-radius' => '7', + 'box-shadow-x' => '0', + 'box-shadow-y' => '0', + 'box-shadow-blur' => '0', + 'box-shadow-spread' => '0', + 'box-shadow-color' => '#ffffff', + 'align' => 'center', + 'block_background' => '', + 'block_padding_left' => 0, + 'block_padding_right' => 0, + 'block_padding_bottom' => 15, + 'block_padding_top' => 15 +); + +$options = array_merge($defaults, $options); + +if (empty($options['image']['id'])) { + if ( !empty($options['image-url']) ) { + $media = new TNP_Media(); + $media->url = $options['image-url']; + $media->width = $composer['width']; + } else { + $media = new TNP_Media(); + // A placeholder can be set by a preset and it is kept indefinitely + if ( !empty($options['placeholder']) ) { + $media->url = $options['placeholder']; + $media->width = $composer['width']; + $media->height = 250; + } else { + $media->url = esc_url( MBTNP_PLUGIN_URL . '/images/placeholder-image.jpg' ); + $media->width = $composer['width']; + $media->height = 250; + } + } +} else { + $media = tnp_resize_2x($options['image']['id'], [$composer['width'], 0]); + // Should never happen but... it happens + if (!$media) { + echo 'The selected media file cannot be processed'; + return; + } +} + +if (!empty($options['width'])) { + $media->set_width( $options['width'] ); +} +$media->link = $options['url']; +$media->alt = $options['image-alt']; +$media->border_radius = $options['border-radius']; + +echo '
'; + +if ( $media->link ) { + echo ''; +} else { +} + +echo 'height ) { + echo ' height="', esc_attr( $media->height ), '"'; +} +echo ' alt="', esc_attr( $media->alt ), '"'; +// The font size is important for the alt text +echo ' border="0" style="display: block; height: auto; max-width: ', esc_attr( $media->width ), 'px !important; width: 100%; padding: 0; border: 0; font-size: 12px;'; +if( $media->border_radius ){ + echo ' border-radius: ' . esc_attr( $media->border_radius ) . 'px;'; +} +if( $options['box-shadow-x'] || $options['box-shadow-y'] || $options['box-shadow-blur'] || $options['box-shadow-spread'] || $options['box-shadow-color'] ){ + + if( empty($options['box-shadow-x']) ){ $options['box-shadow-x'] = '0'; } + if( empty($options['box-shadow-y']) ){ $options['box-shadow-y'] = '0'; } + if( empty($options['box-shadow-blur']) ){ $options['box-shadow-blur'] = '0'; } + if( empty($options['box-shadow-spread']) ){ $options['box-shadow-spread'] = '0'; } + if( empty($options['box-shadow-color']) ){ $options['box-shadow-color'] = '#000000'; } + + echo ' box-shadow: ' . esc_attr( $options['box-shadow-x'] ) . 'px ' . esc_attr( $options['box-shadow-y'] ) . 'px ' . esc_attr( $options['box-shadow-blur'] ) . 'px ' . esc_attr( $options['box-shadow-spread'] ) . 'px ' . esc_attr( $options['box-shadow-color'] ) . ';'; +} +echo '">'; + +if ( $media->link ) { + echo ''; +} else { +} + +echo '
'; \ No newline at end of file diff --git a/blocks/mbtnp-image/icon.png b/blocks/mbtnp-image/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb940c68e06e5a7230f37960f2f2b85cf6e7274 GIT binary patch literal 6225 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 literal 0 HcmV?d00001 diff --git a/blocks/mbtnp-image/options.php b/blocks/mbtnp-image/options.php new file mode 100644 index 0000000..ea6e8da --- /dev/null +++ b/blocks/mbtnp-image/options.php @@ -0,0 +1,53 @@ + + +hidden('placeholder') ?> +media('image', 'Choose an image', array('alt' => false)) ?> +url('image-url', 'or full path to an external image') ?> +text('image-alt', 'Alternative text') ?> +url('url', __('Link URL (if you want to link the image)', 'advanced-composer-blocks-for-newsletter')) ?> + +
+
+ size('width', __('Width', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ align() ?> +
+
+ +
+ +
+
+ size('border-radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+

Box shadow

+ + + + + + + + +
color('box-shadow-color', __('Color', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-x', __('↔ X-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-y', __('↕ Y-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-blur', __('Blur', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-spread', __('Spread', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+ +block_commons() ?> diff --git a/blocks/mbtnp-posts-list/block.php b/blocks/mbtnp-posts-list/block.php new file mode 100644 index 0000000..940e3b4 --- /dev/null +++ b/blocks/mbtnp-posts-list/block.php @@ -0,0 +1,223 @@ +'post', + 'number_posts' => 3, + 'wrap_padding_left' => 10, + 'wrap_padding_right' => 10, + 'wrap_padding_top' => 10, + 'wrap_padding_bottom' => 10, + 'wrap_border_width' => 0, + 'wrap_border_color' => '#000000', + 'wrap_border_radius' => 0, + 'post_list_row_gap' => 0, + 'image_align' => 'left', + 'image_size' => 'none', + 'border_radius' => 0, + 'hide_titles' => '', + 'link_titles' => '', + 'title_font_size' => '24', + 'title_font_align' => 'left', + 'post_date_font_size' => '14', + 'post_date_font_align' => 'left', + 'post_content_font_size' => '16', + 'post_content_font_align' => 'left', + 'show_content' => 'none', + 'button_text' => 'Read more', + 'button_text_font_size' => '16', + 'button_color' => '#000000', + 'button_text_color' => '#ffffff', + 'button_border_radius' => '3', + 'button_align' => 'left', + 'block_padding_left'=>15, + 'block_padding_right'=>15, + 'block_padding_top' => 20, + 'block_padding_bottom' => 20, + 'block_background'=>'#eeeeee' +); + +$options = array_merge($default_options, $options); + +$title_style = TNP_Composer::get_title_style($options, 'title', $composer); +$post_date_style = TNP_Composer::get_title_style($options, 'post_date', $composer); +$post_content_style = TNP_Composer::get_title_style($options, 'post_content', $composer); +$button_text_style = TNP_Composer::get_title_style($options, 'button_text', $composer); +$text_style = TNP_Composer::get_style($options, '', $composer, 'text'); +$post_custom_html_style = TNP_Composer::get_style($options, '', $composer, 'post_custom_html'); + +?> + + +
+ + + $options['post_type'], + 'posts_per_page' => $options['number_posts'] + ); + if( $options['post_order'] == 'title_asc' ){ + $post_list_args['orderby'] = 'title'; + $post_list_args['order'] = 'ASC'; + } else if( $options['post_order'] == 'title_desc' ){ + $post_list_args['orderby'] = 'title'; + $post_list_args['order'] = 'DESC'; + } else if( $options['post_order'] == 'date_asc' ){ + $post_list_args['orderby'] = 'date'; + $post_list_args['order'] = 'ASC'; + } else if( $options['post_order'] == 'date_desc' ){ + $post_list_args['orderby'] = 'date'; + $post_list_args['order'] = 'DESC'; + } + $posts_list = get_posts($post_list_args); ?> + + + + + + +
+ +
+ ID) ).'" inline-class="featured-image-link">'; } ?> + + '; } ?> +
+ + +

+ ID) ).'" inline-class="title-link">'; } ?> + post_title ); ?> + '; } ?> +

+ + +

+ post_date) ) ); ?> +

+ + +
+ ID, $options['excerpt_length'] ) ); + } else { + echo wp_kses_post( get_the_excerpt( $post->ID ) ); + } ?> +
+ + +
+ ID) ); ?> +
+ + +
+ ID ) ); ?> +
+ + + + +
+
\ No newline at end of file diff --git a/blocks/mbtnp-posts-list/icon.png b/blocks/mbtnp-posts-list/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5d1d67714885d65af173fd52d2e76d599b726a GIT binary patch literal 5642 zcmdrwX*iT^+f#^=2rZVFR3rv7#*CRPkzHfYk}P8uCT1}+veOgNVkujegb*^wE^Co} zE3$7z$X*KB-%-!=eD9Cvcz=A~`|G=p}TF9wmCjA9|CkuOS&l;Pj^RCaR4qk$eo7ZMHWp)B@`E|NLlTb30A{sN&p zD~tUW$`WM+yiBIzfCw2d2qPy42Ev&$C=8;AK)~T}X&^)nA}=cklZ7aNAo55BI1&s6 z{&|TpIa0BBq=|;spZu6_%3@A*It3{!>+bF@<1Q~lraH=k5eS5=97GlZ0Wl#!G*1#8 z?Exau&iq9|14qM92^2bkOaksvL_3h(=*nVDX@75nNI{|gCQPFJsVt`2WIfOnS+I

{mrcLl?{z7Kz?>{rz17u2rG^7%khC#b% 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 AoB#j- literal 0 HcmV?d00001 diff --git a/blocks/mbtnp-posts-list/options.php b/blocks/mbtnp-posts-list/options.php new file mode 100644 index 0000000..20ac015 --- /dev/null +++ b/blocks/mbtnp-posts-list/options.php @@ -0,0 +1,246 @@ + + + true ), 'objects' ); +$post_type_options = []; +foreach($post_types as $post_type){ + $post_type_options[$post_type->name] = $post_type->label; +} + +// get all thumbnail size options +$image_sizes = wp_get_registered_image_subsizes(); +$image_size_options = ['none' => 'None']; +foreach($image_sizes as $name => $details){ + $image_size_options[$name] = ucfirst(str_replace('_', ' ', $name)) . ' (' . $details['width'] . 'x' . $details['height'] . ')'; +} +$image_size_options['full'] = 'Full'; +?> + +

+
+ select('post_type', __('Post type'), $post_type_options) ?> +
+
+ select('post_order', __('Post order'), ['title_asc' => 'Title ASC', 'title_desc' => 'Title DESC', 'date_asc' => 'Post date ASC', 'date_desc' => 'Post date DESC']) ?> +
+
+ number('number_posts', __('Number of posts'), ['min' => 1]) ?> +
+
+ +

Featured images

+
+
+ select('image_size', __('Image size'), $image_size_options) ?> +
+ +
+ +
+
+ select('image_align', __('Align'), ['left' => 'Left', 'center' => 'Center', 'right' => 'Right']) ?> +
+
+ size('border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +

Titles

+
+
+ checkbox('hide_titles', __('Hide titles')) ?> +
+ +
+ +
+ font('title_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Post dates

+
+
+ checkbox('show_post_dates', __('Show post dates')) ?> +
+
+ +
+ font('post_date_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Post content

+
+
+ select('show_content', __('Show content'), ['none' => 'None', 'excerpt' => 'Excerpt', 'full' => 'Full']) ?> +
+
+ number('excerpt_length', __('Excerpt length (characters)')) ?> +
+
+ +
+ font('post_content_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Custom content

+

Add custom fields by using brackets. Ex: for "custom_name", use {field_custom_name}

+wp_editor( 'post_custom_html', 'Content', [ + 'post_custom_html_font_family' => $composer['post_custom_html_font_family'], + 'post_custom_html_font_size' => $composer['post_custom_html_font_size'], + 'post_custom_html_font_weight' => $composer['post_custom_html_font_weight'], + 'post_custom_html_font_color' => $composer['post_custom_html_font_color'], +] ) ?> + +

Buttons

+checkbox('hide_buttons', __('Hide buttons')) ?> +
+ text('button_text', __('Button text', 'advanced-composer-blocks-for-newsletter')) ?> + font('button_text_font', '', [ 'family_default' => true, 'size_default' => true, 'weight_default' => true, 'align'=>false, 'color'=>false ] ) ?> +
+ +
+
+ color('button_text_color', __('Text color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('button_color', __('Button color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('button_border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+ select('button_width', 'Width', ['inline' => __('Inline'), 'full_width' => __('Full width')]) ?> +
+
+ select('button_align', 'Alignment', ['center' => __('Center'), 'left' => __('Left'), 'right' => __('Right')]) ?> +
+
+ +

Layout

+size('post_list_row_gap', __('Row gap', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('wrap_border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('wrap_background_color', __('Background color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('wrap_border_width', __('Border width', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('wrap_border_color', __('Border color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+ + + + + + +
size('wrap_padding_left', __('← Left', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_top', __('↑ Top', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_bottom', __('↓ Bottom', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_right', __('→ Right', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ + +
+ + + +block_commons() ?> \ No newline at end of file diff --git a/blocks/mbtnp-single-post/block.php b/blocks/mbtnp-single-post/block.php new file mode 100644 index 0000000..342f032 --- /dev/null +++ b/blocks/mbtnp-single-post/block.php @@ -0,0 +1,234 @@ + 10, + 'wrap_padding_right' => 10, + 'wrap_padding_top' => 10, + 'wrap_padding_bottom' => 10, + 'wrap_border_width' => 0, + 'wrap_border_color' => '#000000', + 'wrap_border_radius' => 0, + 'image_align' => 'center', + 'image_size' => 'medium', + 'link_image' => '', + 'border_radius' => 0, + 'hide_title' => '', + 'link_title' => '', + 'title_font_size' => '24', + 'title_font_align' => 'left', + 'post_date_font_size' => '16', + 'post_date_font_align' => 'left', + 'post_content_font_size' => '16', + 'post_content_font_align' => 'left', + 'post_custom_html_font_size' => '16', + 'post_custom_html_font_align' => 'left', + 'post_custom_html_font_color' => '#000000', + 'show_content' => 'excerpt', + 'hide_button' => '', + 'button_text' => 'Read more', + 'button_text_font_size' => '16', + 'button_color' => '#000000', + 'button_text_color' => '#ffffff', + 'button_border_radius' => '3', + 'button_align' => 'left', + 'block_padding_left'=>15, + 'block_padding_right'=>15, + 'block_padding_top' => 20, + 'block_padding_bottom' => 20, + 'block_background'=>'#eeeeee' +); + +$options = array_merge($default_options, $options); + +$title_style = TNP_Composer::get_title_style($options, 'title', $composer); +$post_date_style = TNP_Composer::get_title_style($options, 'post_date', $composer); +$post_content_style = TNP_Composer::get_title_style($options, 'post_content', $composer); +$button_text_style = TNP_Composer::get_title_style($options, 'button_text', $composer); +$text_style = TNP_Composer::get_style($options, '', $composer, 'text'); +$post_custom_html_style = TNP_Composer::get_style($options, 'post_custom_html', $composer); + +?> + + +
+ + + + $post_arr, + 'posts_per_page' => 1, + 'post_type' => $post_type + ); + $posts_list = get_posts($post_list_args); ?> + + + + + + + + + + + + + + + +
+ +
+ ID) ) . '" inline-class="featured-image-link">'; } ?> + + '; } ?> +
+ + +

+ ID) ) . '" inline-class="title-link">'; } ?> + post_title ); ?> + '; } ?> +

+ + +

+ post_date) ) ); ?> +

+ + +
+ ID, $options['excerpt_length'] ) ); + } else { + echo wp_kses_post( get_the_excerpt( $post->ID ) ); + } ?> +
+ + +
+ ID) ); ?> +
+ + +
+ ID ) ); ?> +
+ + + + +

That post ID is not valid. How to find your post ID.

Please enter a post ID. How to find your post ID.

+
\ No newline at end of file diff --git a/blocks/mbtnp-single-post/icon.png b/blocks/mbtnp-single-post/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..10143f403003c5cabda91c2957da3ffeee1fc8e2 GIT binary patch literal 6833 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 + + true ), 'objects' ); +$post_type_options = []; +foreach($post_types as $post_type){ + $post_type_options[$post_type->name] = $post_type->label; +} + +// get all thumbnail size options +$image_sizes = wp_get_registered_image_subsizes(); +$image_size_options = ['none' => 'None']; +foreach($image_sizes as $name => $details){ + $image_size_options[$name] = ucfirst(str_replace('_', ' ', $name)) . ' (' . $details['width'] . 'x' . $details['height'] . ')'; +} +$image_size_options['full'] = 'Full'; +?> + +
+
+ text('post_id', __('Post ID', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+   +
+
+   +
+
+ +

Featured image

+
+
+ select('image_size', __('Image size', 'advanced-composer-blocks-for-newsletter'), $image_size_options) ?> +
+ +
+ +
+
+ select('image_align', __('Align', 'advanced-composer-blocks-for-newsletter'), ['center' => 'Center', 'left' => 'Left', 'right' => 'Right']) ?> +
+
+ size('border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +

Title

+
+
+ checkbox('hide_title', __('Hide title', 'advanced-composer-blocks-for-newsletter')) ?> +
+ +
+ +
+ font('title_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Post date

+
+
+ checkbox('show_post_date', __('Show post date', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+ font('post_date_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Post content

+
+
+ select('show_content', __('Show content', 'advanced-composer-blocks-for-newsletter'), ['none' => 'None', 'excerpt' => 'Excerpt', 'full' => 'Full']) ?> +
+
+ number('excerpt_length', __('Excerpt length (characters)', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+ font('post_content_font', '', ['family_default'=>true, 'size_default'=>true, 'weight_default'=>true, 'align'=>true]) ?> +
+ +

Custom content

+

Add custom fields by using brackets. Ex: for "custom_name", use {field_custom_name}

+wp_editor( 'post_custom_html', 'Content', [ + 'post_custom_html_font_family' => $composer['post_custom_html_font_family'], + 'post_custom_html_font_size' => $composer['post_custom_html_font_size'], + 'post_custom_html_font_weight' => $composer['post_custom_html_font_weight'], + 'post_custom_html_font_color' => $composer['post_custom_html_font_color'], +] ) ?> + +

Button

+checkbox('hide_button', __('Hide button', 'advanced-composer-blocks-for-newsletter')) ?> +
+ text('button_text', __('Button text', 'advanced-composer-blocks-for-newsletter')) ?> + font('button_text_font', '', [ 'family_default' => true, 'size_default' => true, 'weight_default' => true, 'align'=>false, 'color'=>false ] ) ?> +
+ +
+
+ color('button_text_color', __('Text color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('button_color', __('Button color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('button_border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+ select('button_width', 'Width', ['inline' => __('Inline', 'advanced-composer-blocks-for-newsletter'), 'full_width' => __('Full width', 'advanced-composer-blocks-for-newsletter')]) ?> +
+
+ select('button_align', 'Alignment', ['center' => __('Center'), 'left' => __('Left'), 'right' => __('Right')]) ?> +
+
+ +

Layout

+
+
+ size('wrap_border_radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('wrap_background_color', __('Background color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ size('wrap_border_width', __('Border width', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('wrap_border_color', __('Border color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+ + + + + + +
size('wrap_padding_left', __('← Left', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_top', __('↑ Top', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_bottom', __('↓ Bottom', 'advanced-composer-blocks-for-newsletter')) ?>size('wrap_padding_right', __('→ Right', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ + +
+ + + +block_commons() ?> \ No newline at end of file diff --git a/blocks/mbtnp-text/block.php b/blocks/mbtnp-text/block.php new file mode 100644 index 0000000..030d490 --- /dev/null +++ b/blocks/mbtnp-text/block.php @@ -0,0 +1,96 @@ +'

Insert your text here.

', + 'font_family'=>'', + 'font_size'=>'', + 'font_color'=>'', + 'block_padding_left'=>15, + 'block_padding_right'=>15, + 'block_padding_top' => 20, + 'block_padding_bottom' => 20, + 'block_background'=>'#eeeeee' +); + +$options = array_merge($default_options, $options); + +$text_style = TNP_Composer::get_style($options, '', $composer, 'text'); + +?> + + + + + + +
+ +
\ No newline at end of file diff --git a/blocks/mbtnp-text/icon.png b/blocks/mbtnp-text/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..73ef94e24ef8b2c69783c5b15a20e9071e3d0232 GIT binary patch literal 4244 zcmd5gXH-*Z+HsVQf*^uMB}S1&3<)75Bs6JKh6pN-NDpbWBtSx!;8LWhAWc+?AR>+w z>AeUF2#BB}y@)782vtCklD*96?EaXu=X~F zVCXA4V~CEgTAWYCld+cZkPGlz65fKPw2nN7VXrvkzi@{({L68Wf3LJrkBUNEY6`U#t zr;LL9xS)VWPZ9-pUjNJweZWc+>cnEXklbH-JPa=>L%CVo!K>Yr@qHRLJ8l0J@Gmsd9 zn?8f+MI+N$#`>C2;EfW=nS@g%IHDbu9kDPq6p;W!Q3%Q~H6jTOqaeu?RSZ_eQ5B{3 zQ_kPK!m~p6XDw>@*gGha|@`$ZS=1u02Y6> z5t$D3jwjG0bvEBrKp@d7V|^V9-vREh2+QL0Kc9I>2p!izg+&N4pmR-E^I|@n%qf}; ziE=0}Nhr#Cd?+SH*jB?j;u$^Tk?;O83-jw13r%`X7rTnm<(0A?^cXg+LgXS860bq| zEg?H#@wLNTO1OHw;K7%q#r4C{@|8@g;I}sq5wCwNN%Hm6WhKRqDgGF3Y*nS@&}C)JXQ1cbUvFpO*XDh~8!aCmV(L*{i%& zp;`C$v4*{FHY-c;cI_dbDomh>$(L*EHGDg62!cDze#^Hnn(E&feiHoI#|)2O*xD)H z*u2nFHrioXz)hV|2QN^K81LKG#ZC)?8>W_%vw7>8E1DqKy|K@d+CeK>yMF&L_T<<| z5a>*3_WSW^y9#0hQE2fwYs&rhH`%M=Xi)L{kjYIT)+v4JTV}q`f`NN5c zyVuS+{nqj-chB9ekzaIuJ?(rqho#xY%lm3q!`Jt8Uz;~4UmWtx3e(TuX%wy6Gvfzu2eCC{ZYSIh)4elTdVzVwAna@r?cIsm zfF!p$sCZ*%Q+5dIXhyu7p%_?$(Tqonq_`NfdpN&Zn{bJsdvg)tBQYz6@ZWh55|_5ar8kEC_==eUCsHnpTxwq} z1rj8TKaSStj*~84_WE>p5)HShtE>6wP}6d0^7F*Lv#DM6W}RI-X~?(o9X0YxxzyRa z`>QE<)q1QKo7<*p-yPI)HHUH6dcD+o$LU6sMZL`Xhtw&u@>vf5KyOw1NS(5>HRR*v z`WpJ(dLYYVdASK@n^mDp=CfmXhC|YobFr!!qYpk*#d^dG2@;?tuKjPd&bA5jXO^Th z<%<>@FB%lW4k>TMy?M@W2p8h_PPStoE3qJaXZii?P{|ZE@ zmmOE0&uO}8U1nHsgoxNUZ^s)q!Hz%j<9%CxQfiQ)-tHE(BEKRnvlm@-eY!4B2!Bqz z(tJ!w_O1Fqh6*;mx^}jTT1hQ^QMXs01yQn~nF&T8pM!qii=`?5=)e@y;0!yb*4)WuH5YVlNmAHK8s<*1cN*A zsi2lCmLaEE)#GC}l^Z>F>~4V8fHbvq&)vc#sWZ$m$no+|^;PMHlf?olgS6>@dToQJ zvYM4m_oJKYWAQF7QRP-UZwL~#tlDMOXCB%Sd|ughx!jOpw@QNTZUk_jQ77d+0E;{ut zuscyY&u>d=J-LeH^-{D^GNAn4_n101|MIIht0oI&9NF}{ov#J6@h&QB%-3le`FY@A z^YTR3sE;GXwAorkw?hc1DZdV%Y?}I7PW)U^d%W??DRFrmcUp$0`z*EEJ3K$>@iH)` zp8Bob^uOkDRUCalkAKPk!)xoO^~BiP5q+=r*HOEzLu@{2t+&Ly|H?Tma+_g^dj>mm z^l}zDM|;NJR?W$IjJD!0`9AwnQdeA`qKJ0LMc3<&a|#DHX?{%&a_wnln>vE=FUZoO z8*9U(>y4LZxa%jV=DeY%yS1#pO4@E_yO4W~nkRV?bwmz?%g^ z3ycpA)%SiC>!@7(_?5f$C@Ua|+aA6YZFjyVQ^PyI;g$o!2dJg`bF^H+UV>dt+N##(Bsd$m5TNgbLADyK3a6@w_)n(@*O* zf^Wk*=jldQbh2~>V6IlH<&spbibZLiK472++fPT?r4)Y{+bDeJqF(ONzLFl6F*cCU zD4+|M(iA_W?&8Zi@{sTPZ@s2(_g$(kJCGsQFwO8^yLnGm!JFa$(Yf=iw&|s!k|=xA zV{U6QXtU>bp8CpRwUX?QrVvHD$s(utSoUOsM+Vrvv(~4n<^ZNCaI-H45z_lK(4YITu8@Ca z)~>T0IBTsYNo4kTdlFy0OOnN5td;FBR8DR+@%xl@mZZpRS)znaS2mvtBLzwI7@8iP zme5!7|E1m`V!tpIv6{Tp5nH&kYdb|+*(GW1!XXj-rRy4!@^>A@4;nndnY*X6 z1bBExY7czkMc~16w^CZzOSMABuBE+f(-}LG5;*<|+^i2zDgQ*xc>f3(=d+2yg_4Nj zLI*!vYQqqEVW8`c#c80Z3XP7-HHk_@sw$;m$&D)COmpPJ{VK6x<3}hZ zf{BQ+q!)p)TY>)knXMeT&r$-DaCS|;E<9OVb>)I7BsR+;88NmiA*h1Uw;EhA=rX)n z{C$PHQJ)#L7Lz+N@5serZdAGqJPay0V3r#9w&<`r&z<9bv7>x)h5I(s)jMQ}HBsDO z>H2L@PThr_=1o)atoA`?9zA~Q{@yfko{f>a4n^V#s-X+z%rqf5r2-l@c??MH(go6<2fC4)U6HY z^~%)s0B>R^wQQYt#=E^Ws`_j%_tc;`AgW-g$Jt)i!pBGg3**a7yZ`_I literal 0 HcmV?d00001 diff --git a/blocks/mbtnp-text/options.php b/blocks/mbtnp-text/options.php new file mode 100644 index 0000000..7d85b08 --- /dev/null +++ b/blocks/mbtnp-text/options.php @@ -0,0 +1,83 @@ + +

+ You can use tags to inject subscriber fields. +

+ +wp_editor( 'html', 'Content', [ + 'text_font_family' => $composer['text_font_family'], + 'text_font_size' => $composer['text_font_size'], + 'text_font_weight' => $composer['text_font_weight'], + 'text_font_color' => $composer['text_font_color'], + 'background' => $background +] ) ?> + +
+
+ size('border-radius', __('Border radius', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('background-color', __('Background color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ color('border-color', __('Border color', 'advanced-composer-blocks-for-newsletter')) ?> +
+
+ +
+
+

Padding

+ + + + + + +
size('padding-left', __('← Left', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-top', __('↑ Top', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-bottom', __('↓ Bottom', 'advanced-composer-blocks-for-newsletter')) ?>size('padding-right', __('→ Right', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+
+

Border

+ + + + + + +
size('border-left', __('← Left', 'advanced-composer-blocks-for-newsletter')) ?>size('border-top', __('↑ Top', 'advanced-composer-blocks-for-newsletter')) ?>size('border-bottom', __('↓ Bottom', 'advanced-composer-blocks-for-newsletter')) ?>size('border-right', __('→ Right', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+
+

Box shadow

+ + + + + + + + +
color('box-shadow-color', __('Color', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-x', __('↔ X-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-y', __('↕ Y-offset', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-blur', __('Blur', 'advanced-composer-blocks-for-newsletter')) ?>size('box-shadow-spread', __('Spread', 'advanced-composer-blocks-for-newsletter')) ?>
+
+
+ +
+ +block_commons() ?> \ No newline at end of file diff --git a/css/mbtnp-blocks-copy-paste-block.css b/css/mbtnp-blocks-copy-paste-block.css new file mode 100644 index 0000000..62436ce --- /dev/null +++ b/css/mbtnp-blocks-copy-paste-block.css @@ -0,0 +1,39 @@ +/* Copy/Paste styles */ +.tnpc-row-mbtnp-copy, +.tnpc-row-mbtnp-paste { + height: 30px; + width: 30px; + top: 0px; + background-color: rgba(255,255,255,0.5); + z-index: 5; + position: absolute; + color: rgba(102,102,102,1); + transition: all 0.2s; + opacity: 0; + text-align: center; + font-size: 18px; + cursor: pointer; + + &:hover { + background-color: #e0e0e0; + cursor: pointer; + color: rgba(0, 0, 0, 1); + + img { + transform: scale(0.8); + } + } +} + +.tnpc-row-mbtnp-copy { + right: 120px; +} + +.tnpc-row-mbtnp-paste { + right: 90px; +} + +.tnpc-row:hover .tnpc-row-mbtnp-copy, +.tnpc-row:hover .tnpc-row-mbtnp-paste { + opacity: 1; +} \ No newline at end of file diff --git a/images/icon-copy.png b/images/icon-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebe58731273abc4c573ec205556d1e168db092f GIT binary patch literal 1978 zcmaJ?dsGu=79V23fP~6J9tGVYuu6d>GkG#8K|&rHAP6BKmPeUPCJ-RWkVFaSDkxZ? zR!<)kR&*CUib$2J2V1CHfj)476t$+kjdk2K7xLL^D85B50XBJtE!C{Im7o?Jkm$@>98?<7 zJY0>Vy3*o4JQ@I&>^5jJY#FLV5oR{BP=^o8ZY0QP0Ek{|Cs3>qw}Dzb&tMWW{&lX4 z0UC5-#zwvhQV~)-->|;Sf~S@xX|S?F4AC*x#(>dw5eZ<#Z766r7MZLfyO=SLDsFFdc*@A-z3ua;v!~ul}OQ%J-I+UyBM}i!P!)3!9Hq2+jkch_- zafRT*#UK+}bb66mrdUWv?!=6In~e~$*(D_z(=Zj64#3$YL;b+OcMrF%OXy{5qM zJp*CYdjkDyv#9c(T;I@+K-J#E`rhf&E;UVM&CPX_1?OU-V~#(3o;|1fWv**`iT1dr zzvhhl83t=NAT1B>UY<*XsQ#405xc(R35D{X=>+^SoY6NCugq5CR4xpOL*1j zwiTCC8lg)GT|g~3x;@{u{Lv?ktWIbuuzrbGP9@8wd&Xb0D}h^l=hWi}U~pgg0ovZX zyDw12#q|Rl8h6e%tbV*|;+y`7*FFNG&ihXS(Ehgf+n>2S!K^3hof86r13#}=3Eusq zn$j`$WnaaEzIx)F_eSDd21;)v3`OTYs_geq9{;Yi>+Y3eU*g#sKp4KO_3EiD$a|gi z)D)WW(!El@zJx^HnDlXg#|h`88CAEs;c%7dc}-y8(stV5$`8h~!iMUmrd-384pN*0 z#@jTK?);wXIn<`i0Bq%xqr-1ZbRJBITh1FsxAN0!0`8@1s68FICobH-`AcN{o3%0V zR>6f^ZoTpCH|Tfk&JAoo`l$!&*p*a|!0e`5^sg!kGunJ!^QENzULao!gcrR<7>C@} zM~`@X?HQiekSGmprF&M3ojuQ&KX6`^`|W?^dgtyLbxV3Vn(G(){uxv7HtqDyY|L8!dh_(1>sfv6PlGyugHEDN z137c*jGdLcy!0)%|0>KfL}dFNxVSt7ZMZn<>a|)=>(y5kyy@;Wab;TH)AX)~%D1vD znBq0rbk%7ja?Q1^oyWf~;C@t9sc2Cga;q$gh`rppZz*(v(YLyKoVv|>Z(6W3J#7qm zD1ZCUk={X*=~J}!Gdrv5X1ende>y~&`^VUXy&>XwUF=Rz+f<(3vnH(d+J?6t=Il7PqHMh5-2=>=9qAFz z4uR7viR!V@*_ohAWori%=l`%Fh&w0nD~3twxI4`&3H<8c8_S&l0`WV$tZ>BfcLtR5 LBw1Tr?#}-Km*w_t literal 0 HcmV?d00001 diff --git a/images/icon-paste.png b/images/icon-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..4136d9926d9d2bda7d811f1ae0c66a7f628ba650 GIT binary patch literal 1979 zcmaJ?dsGu=7LNgHL=fa5g=ICy2ahx}naOiff(e;KqJ|=JkacZ!UXT=$iOFCBDjR|d z`1Z&O@@QczN~OmKMO}e&MAWX;>Xu?#rLCnF#99OoEL)EU+nuPm{lnckXXcyl&b`0; zyT9+=GZpD+OM?Sr0y!K`urU?QU{{Ur=Do%~k6AX{VV7t|pUteIa~K!qpg3BR#woth zise!n6h;@ZGaQwDgGP9X%(+U+qTLH}H1GuerHk!jpTH>~2L>|TPaVpnhQwv5r z&I|Y!QY~05Gl@-h9c8wp7CER@MQNEtQ67Pif+flPB)5tMuu=@hcU$vqPL*3Nc!sND z-+g9Kz<=h#x5hPYg zVUJdk(7`?3JF3{5}Xjch$nw1-}6poEo>R~DK;v(SOF6Ri$NhWR!mYV6Dbj# z6yZ{mgb^`CDKMD;WGRBa&iP#@O_|vC^u4|u4R-T#xF{PtQ4V%=Z0i6wJCWCns5aBx zH~eR#IYJxpu;Nhjk6|mNKzvLRTG|{{R=%UdKjLn&EV23k|C4|Sf3W93N~RZyzq>uq z`-hPoP`p>657}RFZBb0*2dHsH-!I1CHr>SGss|6=ZBI`6bwz<|;y3zO@zXVnv6>^Z za}&fkP{T2K7Hh&AW_<2%=H3-<69{YDJCE?*4ch0>*g_tKKmNjTwlVGvZrI;4Fy;Bk z2g>w;v7S*)WU4#tPu%{=HO<20WA|Un@orV@-#N{mJguNRS7z)l9}{tI?D5q2?`n&v z;zR}98k^qSwmI%%vfpSAtkNyw>;bo_f<8Nv8~fGM8ISXvqRZZ<@J7{$Ux((B@I(LX z8rSZ!_M=_>S+zwi4aeI*I#D&OsoxC~n);v}2fH~mUt+6e@qbtEP zR`MHmuKMaalQ7g5t5}GZc;4*%X#Y=}$27PVB|iF!TYOU`FiNtfq{L|3Mfx+vj zz$3uJaRxs)=RI{|?iq@_!cZherYu_48T^ zHmB{Y_XDtV?qwP4M#-7cCG~M>_s?IyyjD8x;M1& literal 0 HcmV?d00001 diff --git a/images/placeholder-image.jpg b/images/placeholder-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4585af8d9be157ff44c693f53c1cbadc98eef771 GIT binary patch literal 47268 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 literal 0 HcmV?d00001 diff --git a/inc/menus.php b/inc/menus.php new file mode 100644 index 0000000..7598c05 --- /dev/null +++ b/inc/menus.php @@ -0,0 +1,77 @@ + +
+

Advanced Composer Blocks Settings

+
+ +
+
+ Customize the behavior of Advanced Composer Blocks.

'; +} + +function mbtnp_disable_live_preview_cb() { + $options = get_option('acb_settings'); + ?> + /> +
'; + + function showToast(message, type = 'info') { + let backgroundColor = '#000'; // Default color for 'info' + if (type === 'success') { + backgroundColor = '#234567'; // MBTNP blue for success + } else if (type === 'error') { + backgroundColor = '#dc3545'; // Red for error + } + + Toastify({ + text: message, + backgroundColor: backgroundColor, + duration: 3000, + gravity: 'top', // 'top' or 'bottom' + position: 'center', // 'left', 'center' or 'right' + }).showToast(); + } + + function addCopyPasteButtons() { + // add new copy/paste buttons + $('.tnpc-row .tnpc-row-clone').each(function () { + console.log($(this).parents('table').find('.tnpc-row-mbtnp-copy').length); + if ($(this).parents('table').find('.tnpc-row-mbtnp-copy').length < 1) { + $(this).after(copyPasteHTML); + } + }); + // remove any instances not in a table element + $('.tnpc-row-mbtnp-copy.ui-sortable-handle, .tnpc-row-mbtnp-paste.ui-sortable-handle').each(function () { + $(this).remove(); + }); + } + + function initializeCopyPasteFunctionality() { + $(document).delegate('.tnpc-row-mbtnp-copy', 'click', function (e) { + e.preventDefault(); + + let row = $(this).closest('.tnpc-row'); + let new_row = row.clone(); + let row_operations = new_row.find('.tnpc-row-delete, .tnpc-row-edit-block, .tnpc-row-clone, .tnpc-row-mbtnp-copy, .tnpc-row-mbtnp-paste'); + + // remove row operations + row_operations.remove(); + + // save row outer HTML to localStorage + localStorage.setItem('mbtnp-row-ops-copy', row_operations[0].outerHTML); + localStorage.setItem('mbtnp-row-copy', new_row[0].outerHTML); + + showToast('Block copied!', 'success'); + }); + + $(document).delegate('.tnpc-row-mbtnp-paste', 'click', function (e) { + e.preventDefault(); + + let row = $(this).closest('.tnpc-row'); + let row_copy = localStorage.getItem('mbtnp-row-copy'); + let row_ops = localStorage.getItem('mbtnp-row-ops-copy'); + + if (row_copy) { + // Create a jQuery object from the copied HTML string + let new_row = $(row_copy); + + // Append the new row after the current row + row.after(new_row); + + // Add row operations inside the new row + new_row.append(row_ops); + + // Re-add delete, edit, and clone functionality + new_row.add_delete(); + new_row.add_block_edit(); + new_row.add_block_clone(); + + // Add copy/paste buttons to new block + new_row.find('.tnpc-row-clone').after(copyPasteHTML); + + // Scroll to the new row within the tnpb-content div + $('#tnpb-content').animate({ + scrollTop: new_row.offset().top - $('#tnpb-content').offset().top + $('#tnpb-content').scrollTop() + }, 500); + + showToast('Block pasted successfully!', 'success'); + } else { + showToast('No copied block found. Please copy a block first.', 'error'); + } + }); + } + + function customInitBuilderArea() { + init_builder_area(); // Call the original builder initialization + addCopyPasteButtons(); // Add custom copy/paste buttons + initializeCopyPasteFunctionality(); // Initialize copy/paste functionality + + // Add copy/paste buttons to any new blocks inserted into the editor + $(document).on('DOMNodeInserted', '.tnpc-row', function () { + addCopyPasteButtons(); + }); + } + + // Override the original start_composer function + function customStartComposer() { + customInitBuilderArea(); + + // The rest of the original start_composer code + // Closes the block options layer (without saving) + jQuery("#tnpc-block-options-cancel").click(function () { + tnpc_hide_block_options(); + var _target = target; + jQuery.post(ajaxurl, start_options, function (response) { + _target.html(response); + jQuery("#tnpc-block-options-form").html(""); + }); + }); + + // Fires the save event for block options + jQuery("#tnpc-block-options-save").click(function (e) { + e.preventDefault(); + var _target = target; + + // fix for Codemirror + if (typeof templateEditor !== 'undefined') { + templateEditor.save(); + } + + if (window.tinymce) + window.tinymce.triggerSave(); + + var data = jQuery("#tnpc-block-options-form").serializeArray(); + tnpc_add_global_options(data); + tnpc_hide_block_options(); + + jQuery.post(ajaxurl, data, function (response) { + _target.html(response); + jQuery("#tnpc-block-options-form").html(""); + }); + }); + + jQuery('#tnpc-block-options-form').change(function (event) { + var data = jQuery("#tnpc-block-options-form").serializeArray(); + var _container = tnp_container; + var _target = target; + tnpc_add_global_options(data); + + jQuery.post(ajaxurl, data, function (response) { + _target.html(response); + if (event.target.dataset.afterRendering === 'reload') { + _container.find(".tnpc-row-edit-block").click(); + } + }).fail(function () { + showToast("Block rendering failed", 'error'); + }); + }); + } + + // Assign the new start_composer function to be called + window.start_composer = customStartComposer; + + // Call the new start_composer function on document ready + $(document).ready(function () { + start_composer(); + }); + + + // when hovering over tnpc-button[value="Save"], remove copy/paste buttons + $(document).on('mouseenter', '.tnpc-button', function () { + $('.tnpc-row-mbtnp-copy, .tnpc-row-mbtnp-paste').remove(); + }); + +}); diff --git a/js/mbtnp-blocks-live-preview.js b/js/mbtnp-blocks-live-preview.js new file mode 100644 index 0000000..212d02e --- /dev/null +++ b/js/mbtnp-blocks-live-preview.js @@ -0,0 +1,26 @@ +jQuery(function ($) { + // ------------------------------------------------------------------- + + // Extract the ID from the URL + var urlParams = new URLSearchParams(window.location.search); + var id = urlParams.get('id'); + + // Only proceed if the ID is present + if (id) { + // Get the root domain + var domain = window.location.protocol + '//' + window.location.hostname; + + // Create the new button + var livePreviewButton = $('', { + class: 'button-primary', + href: domain + '/?na=view&id=' + id, + target: '_blank', + html: '' + }); + + // Append the button to the menu + $('.tnpb-actions').append(livePreviewButton); + } + + // ------------------------------------------------------------------- +}); \ No newline at end of file diff --git a/mbtnp-blocks.php b/mbtnp-blocks.php new file mode 100644 index 0000000..15b8fb1 --- /dev/null +++ b/mbtnp-blocks.php @@ -0,0 +1,150 @@ +Settings', + ); + $actions = array_merge( $actions, $mylinks ); + return $actions; +} + + +// --------------------------------------------------------------------------------- +// ----- REGISTER NEW BLOCKS ------------------------------------------------------- +// --------------------------------------------------------------------------------- +function mbtnp_newsletter_register_blocks() { + + $mbtnp_blocks = [ + "mbtnp-image", + "mbtnp-posts-list", + "mbtnp-text", + "mbtnp-cover", + "mbtnp-cta", + "mbtnp-single-post" + ]; + + $dir = __DIR__; + + foreach($mbtnp_blocks as $block){ + + if ( file_exists( $dir . '/blocks/' . $block ) ) { + TNP_Composer::register_block( $dir . '/blocks/' . $block ); + } + } +} +add_action( 'newsletter_register_blocks', 'mbtnp_newsletter_register_blocks' ); + + +// --------------------------------------------------------------------------------- +// ----- ADD LIVE PREVIEW BUTTON TO COMPOSER --------------------------------------- +// --------------------------------------------------------------------------------- +function mbtnp_add_live_preview_button_in_admin() { + // Get the current site's URL + $site_url = get_site_url(); + $acb_settings = get_option('acb_settings'); + $acb_live_preview_disable = isset($acb_settings['acb_disable_live_preview']) ? $acb_settings['acb_disable_live_preview'] : false; + + if ($acb_live_preview_disable) { + return; + } + + // enqueue live preview script + wp_enqueue_script( 'mbtnp-blocks-live-preview', plugin_dir_url( __FILE__ ) . 'js/mbtnp-blocks-live-preview.js', array('jquery'), '', true ); +} +add_action('admin_footer', 'mbtnp_add_live_preview_button_in_admin'); + + +// --------------------------------------------------------------------------------- +// ----- ADD COPY/PASTE BUTTONS TO COMPOSER BLOCKS --------------------------------- +// --------------------------------------------------------------------------------- +function mbtnp_add_blocks_copy_paste() { + + // enqueue live preview script and css + wp_enqueue_script( 'mbtnp-blocks-copy-paste', plugin_dir_url( __FILE__ ) . 'js/mbtnp-blocks-copy-paste-block.js', array('jquery'), '', true ); + wp_enqueue_style( 'mbtnp-blocks-copy-paste', plugin_dir_url( __FILE__ ) . 'css/mbtnp-blocks-copy-paste-block.css' ); +} +add_action('admin_footer', 'mbtnp_add_blocks_copy_paste'); + +// --------------------------------------------------------------------------------- +// ----- GET SHORTENED EXCERPT ------------------------------------------------------------------------ +// --------------------------------------------------------------------------------- +function mbtnp_get_the_excerpt( $post_id, $count ) { + $excerpt = get_the_content( '', '', $post_id ); + $excerpt = wp_strip_all_tags( $excerpt ); + if( strlen($excerpt) > $count ){ + $excerpt = trim(substr($excerpt, 0, $count)); + $excerpt .= '...'; + } + return $excerpt; +} + + +// --------------------------------------------------------------------------------- +// ----- REPLACE CUSTOM TAGS (helper) ---------------------------------------------- +// --------------------------------------------------------------------------------- +function mbtnp_replace_tags( $content, $post_id = null ){ + + if( empty($post_id) ){ + return $content; + } + + $post = get_post($post_id); + + // replace {field_XYZ} with value from XYZ custom field + $content = preg_replace_callback( + '/\{field_([^}]+)\}/', + function ($matches) use ($post) { + return get_post_meta($post->ID, $matches[1], true); + }, + $content + ); + + // replace {title} with post title + $content = preg_replace_callback( + '/\{title\}/', + function ($matches) use ($post) { + return get_the_title($post->ID); + }, + $content + ); + + return $content; +} \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..190704c --- /dev/null +++ b/styles.css @@ -0,0 +1,28 @@ +.tnpb-actions { + text-align: center !important; + padding: 0.5rem 1rem !important; +} + +.tnpc-row-edit-block:hover img { + transform: scale(0.8); +} + +.tnpc-row-clone:hover img { + transform: scale(0.8); +} + +.tnpc-row-delete:hover img { + filter: brightness(100); + transform: scale(0.8); +} + +/* ----- Custom styles ----- */ +.mbtnp-section-title { + clear: both; + margin: 0; + font-size: 15px; + font-weight: 500 !important; + padding-top: 17px; + padding-bottom: 5px; + color: #666 !important; +} \ No newline at end of file