--- myst: html_meta: "description": "Block Extensions" "property=og:description": "Block Extensions" "property=og:title": "Block Extensions" "keywords": "Volto, Plone, Pastanaga, Volto blocks extensions" --- # Block Extensions A common pattern in blocks is the "variations" pattern - a slightly different versions of a block that can be toggled on demand by the editors. Choosing the listing template (gallery, summary listing, etc.) for the `Listing` block is one example of the typical use cases for this feature. A block can define variations in the block configuration. These variations can be used to enhance or complement the default behavior of a block without having to shadow its stock components. These enhancements can be at the settings level (add or remove block settings) via schema enhancers or, if the code of your block allows it, even use alternative renderers (e.g., in view mode) showing the enhanced fields or modifying the block behavior or look and feel. ``` export default (config) => { config.blocks.blocksConfig.teaserBlock.variations = [ { id: 'default', title: 'Default', isDefault: true, template: SimpleTeaserView }, { id: 'card', label: 'Card', template: CardTeaserView, schemaEnhancer: ({schema, formData, intl}) => { schema.properties.cardSize = '...'; // fill in your implementation return schema; } } ]; } ``` The capabilities of a block can't be constrained only to the "variations". What if, for example, one such variation is so advanced that it needs its own "variations"? So the `variations` are simply a more concrete example of a Volto block extension. Volto provides several helpers to manage the extensions: - `resolveBlockExtensions`, a function that resolves `extensions` (all available extensions for that block` and `resolvedExtensions` (the current active extensions of that block) - `withBlockExtensions`, a React HOC uses the `resolveBlockExtensions` to inject `extensions` and `resolvedExtensions` as block props - `withBlockSchemaEnhancer` which bootstraps the variation mechanism (by providing a select control to toggle the active variation) and use any defined `schemaEnhancer` for the block - `withVariationSchemaEnhancer`, a React HOC which uses the defined `schemaEnhancer` from the active block variation to mutate the schema. - `withStylingSchemaEnhancer`, a similar HOC which enhances the schema with information from the `stylesSchema`. These 2 helpers are directly wrapped over the `InlineForm` to create the `BlockDataForm` component.