Components are supercharged Partials: they allow you to pass content and data to the file that you are importing into your Template.


Let's create a VML background image component, to which we can pass data about the image, and the HTML to be overlayed on top of it.

We might imagine something like this:

<!--[if mso]>
<v:image src="{{ data.src or '' }}" xmlns:v="urn:schemas-microsoft-com:vml" style="width:{{ data.width or 600 }}px;height:{{ data.height or 400 }}px;" />
<v:rect fill="false" stroke="false" style="position:absolute;width:{{ data.width or 600 }}px;height:{{ data.height or 400 }}px;">
<v:textbox inset="0,0,0,0"><div><![endif]-->
{{ content }}
<!--[if mso]></div></v:textbox></v:rect><![endif]-->

We would like to access data being sent to the Component under the data variable. The 'body' of the Component or, in our case, the HTML to be overlayed, will be accessible under the content variable.

Save the Component to src/components/vmlbg.njk


Import the Component you just created in a Template, with the {% component %} tag:

{% component "src/components/vmlbg.njk" %}
    Overlayed HTML!
{% endcomponent %}


The {% component %} tag takes two arguments: a file path and a data object.


The first argument must be the path to our component file, for example "src/components/vmlbg.njk".

The path needs to be relative to the project directory root.


The second argument can be:

  • a string
  • an array
  • an object

It will be available under the data object inside the Component.

Check the Component definition above, you'll see variables like {{ data.width }}

Here's how you'd pass both arguments:

{% component "src/components/vmlbg.njk", {width: 600, height: 500, src: 'some/image/path.jpg'} %}
    Overlayed HTML!
{% endcomponent %}

Finally, anything that you add between the {% component %} {% endcomponent %} tags will be available to the component under a content variable.

Congratulations! 🎉

You've just recreated the vmlbg.njk Component that Maizzle ships with.

File Paths

Just like with Partials, you can keep your Components wherever you'd like. Just make sure to update the paths so PurgeCSS and Browsersync know about them.