=== Melonpan Block - Container === Contributors: melonpan Tags: gutenberg, blocks, editor, container, innerblocks Requires at least: 5.0 Tested up to: 5.2 Stable tag: 1.1.0 Requires PHP: 5.6 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html Container block with settings that can have other blocks nested. Developers may also use it to create their own blocks making use of the build-in settings and controls. == Description == This block is a container that can have other blocks nested. It comes with several settings: * Background image, fixed, color & opacity * Content align, max-width, text color * Border width, color & opacity * Shadow width, color & opacity * Padding top, bottom, left, right, responsive paddings Developers: The plugin comes with a filter to register your own block based on this one. Check the *How can I use the filter to create my own block?* section for more info. == Screenshots == 1. Block edit panel. == Usage == This block will be added inside the blocks inserter menu under the *Melonpan Blocks* category. Once added in the page you can edit its settings and add other blocks inside. You may even add this same block type inside. == Installation == Installation from the WordPress admin. 1. Log in to the WordPress admin and navigate to *Plugins > Add New*. 2. Type *Melonpan Block - Container* in the Search field. 3. In the results list *Melonpan Block - Container* plugin should appear, click **Install Now** button. 4. Once it finished installing, click the *Activate* button. 5. That's it, now you can go to any post where Gutenberg is enabled and start using the block. == Frequently Asked Questions == = How can I use the filter to create my own block? = The plugin comes with a filter to register your own block extending this one, to make use of the settings that come with it. **Notes** You can choose from the available settings, listed below, and assign the block's InnerBlocks properties to customize it. You may also pass your own attributes, inside the **custom** attribute, this adds a class to the **.mbc-container** div. Check the *How can I add a custom attribute?* section for more info. **Steps** First, you need to [enqueue your script in the editor](https://wordpress.org/gutenberg/handbook/designers-developers/developers/tutorials/javascript/loading-javascript/). Inside your script call the filter in the following way (make sure *Melonpan Block - Container* plugin is active): // Custom block registration example using the filter. wp.hooks.addFilter("melonpanBlockContainer.createBlock", "my-plugin/my-block", blocks => { return blocks.concat({ // These are the default block registration properties. For more available properties: // https://wordpress.org/gutenberg/handbook/designers-developers/developers/block-api/block-registration/ blocktype_props: { name: "my-plugin/my-block", title: "My Block", icon: "carrot", category: "common" }, // These properties will be passed to the InnerBlocks component. For more info: // https://github.com/WordPress/gutenberg/blob/master/packages/editor/src/components/inner-blocks/README.md innerblocks_props: { template: [["core/quote"], ["core/image"]], templateLock: false, allowedBlocks: ["core/quote", "core/image"] }, // Use this property to add extra props to the container, content or background divs. extra_props: { container: { id: "my_id", className: "my_container_class another_class" }, content: {}, background: { className: "my_bg_class", style: { opacity: 0.5 } } }, // This is the list of all the available properties and their default values. // Settings are opt-in so only the ones that are passed will be used. // If an empty object is passed (for example, background_color:{}) the default values will apply. // Set the "show_control" property to false if you want to apply the setting // with the default value but hide the control from the editor. settings: { // Check the "How can I add a custom attribute?" section for more info. custom: { example_attribute_name: { default: "value_A" }, another_example_attribute_name: { default: true } }, align: { default: "", options: ["left", "center", "right", "wide", "full"] }, content_align: { show_control: true, default: "center" }, content_maxwidth: { show_control: true, default: 800, min: 300, max: 1300 }, content_color: { show_control: true, default: "", colors: [ { name: "black", color: "#000000" }, { name: "white", color: "#ffffff" } ] }, background_color: { show_control: true, default: "", colors: [ { name: "banana", color: "#fce198" }, { name: "sandia", color: "#f68c78" }, { name: "melocoton", color: "#ffc5b4" }, { name: "pistacho", color: "#bdb76b" }, { name: "ciruela", color: "#bd8f8f" }, { name: "naranja", color: "#ff7f50" }, { name: "endrina", color: "#708090" }, { name: "black", color: "#000000" }, { name: "white", color: "#ffffff" } ] }, background_image: {}, background_fixed: { show_control: true, default: false }, background_color_opacity: { show_control: true, default: 50, min: 0, max: 100 }, border_color: { show_control: true, default: "", colors: [ { name: "black", color: "#000000" }, { name: "white", color: "#ffffff" } ] }, border_color_opacity: { show_control: true, default: 15, min: 0, max: 100 }, border_width: { show_control: true, default: 0 }, shadow_color: { show_control: true, default: "", colors: [ { name: "black", color: "#000000" }, { name: "white", color: "#ffffff" } ] }, shadow_color_opacity: { show_control: true, default: 15, min: 0, max: 100 }, shadow_width: { show_control: true, default: 0 }, // There are several sets of padding settings which can be combined. // For example: padding_top, padding_bottom and padding_leftright. padding: { show_control: true, default: 20, min: 0, max: 100 }, padding_top: { show_control: true, default: 20, min: 0, max: 200 }, padding_bottom: { show_control: true, default: 20, min: 0, max: 200 }, padding_left: { show_control: true, default: 20, min: 0, max: 100 }, padding_right: { show_control: true, default: 20, min: 0, max: 100 }, padding_topbottom: { show_control: true, default: 20, min: 0, max: 200 }, padding_leftright: { show_control: true, default: 20, min: 0, max: 100 }, // These paddings will apply to screens smaller than 600px in width. // They are meant to override the previous paddings (over this comment). padding_small_screen: { show_control: true, default: 20, min: 0, max: 100 }, padding_top_small_screen: { show_control: true, default: 20, min: 0, max: 200 }, padding_bottom_small_screen: { show_control: true, default: 20, min: 0, max: 200 }, padding_left_small_screen: { show_control: true, default: 20, min: 0, max: 100 }, padding_right_small_screen: { show_control: true, default: 20, min: 0, max: 100 }, padding_topbottom_small_screen: { show_control: true, default: 20, min: 0, max: 200 }, padding_leftright_small_screen: { show_control: true, default: 20, min: 0, max: 100 } }, // This property is experimental. If you need to update the block to a new version, // because either the "settings" or the "extra_props" objects changed, // you need to pass those objects as they were before the change, inside an object. // Then wrap all the different versions inside an array. deprecated: [ { // Old version of the block. extra_props: { // ... }, settings: { // ... } }, { // Another old version of the block. extra_props: { // ... }, settings: { // ... } } ] }); }); = How can I add a custom attribute? = When creating your own block using the **melonpanBlockContainer.createBlock** filter, you can add custom attributes. This setting is meant to be a helper that adds a class with the name and value of the attribute. One of the advantages of using it rather than the *blocks.registerBlockType* filter is that it should work if you need to deprecate the attribute. Keep in mind that it will simply add a class in the **.mbc-container** div, and that a *string*, *number* or *boolean* value can be used. If the attribute is a *string* or *number* the class will include the name and the value (example_attribute_name => **.mbc-example_attribute_name-the_value**). If the attribute is a *boolean* the class will include the name and *enabled* or *disabled* (example_attribute_name => **.mbc-example_attribute_name-enabled**). To add a control for the attribute you may use Gutenberg filters. Remember to remove the control if you deprecate the attribute. Here is an example of adding a control using Gutenberg filters: const { __ } = wp.i18n; const { addFilter } = wp.hooks; const { createHigherOrderComponent } = wp.compose; const { Fragment } = wp.element; const { InspectorControls } = wp.editor; const { PanelBody, RadioControl } = wp.components; const withMyAttributeControl = createHigherOrderComponent(BlockEdit => { return props => { if (props.name !== "my-plugin/my-block") { return ; } const { setAttributes, attributes } = props; return ( setAttributes({ custom: { ...attributes.custom, example_attribute_name: value } }) } /> ); }; }, "withMyAttributeControl"); addFilter( "editor.BlockEdit", "my-plugin/my-filter", withMyAttributeControl ); == Changelog == = 1.1.0 = * Improved code: Updated JS, added tests and migrated JS to Typescript. = 1.0.1 = * Fix bug where the color was empty but the class .mbc-has-color was still assigned. = 1.0.0 = * Initial release. == Credits == Screenshot background image belongs to [Sander Wehkamp](https://unsplash.com/@sanderwehkamp).