Layout

The {{ layout }} tag allows to capture some content in a template and render it into another template under the variable content.

For example, let's say you have the following container.vto template:

<div class="container">
  {{ content }}
</div>

You can pass content to this template easily with the layout tag:

{{ layout "container.vto" }}
<h1>Hello, world!</h1>
{{ /layout }}

Technically, the layout tag works a lot like the following:

{{ set content }}
<h1>Hello, world!</h1>
{{ /set }}

{{ include "container.vto" { content } }}

Data

In addition to the content variable, the layout inherits the same data as the main file. You can pass additional data creating an object after the layout file name.

{{ layout "container.vto" { size: "big" } }}
<h1>Hello, world!</h1>
{{ /layout }}

Now, the layout content has the size variable:

<div class="container size-{{ size }}">
  {{ content }}
</div>

Pipes

You can use pipes to transform the content passed to the layout. For example:

{{ layout "container.vto" |> toUpperCase }}
<h1>Hello, world!</h1>
{{ /layout }}

This code outputs:

<div class="container">
  <h1>HELLO, WORLD!</h1>
</div>

Slots

The {{ slot }} tag allows to split the content into different variables. For example, let's say we have a layout that accepts the variables header and content:

{{ layout "section.vto" { header: "<h1>Section title</h1>" } }}
  <p>Content of the section</p>
{{ /layout }}

A more ergonomic way to define the header variable is using a slot:

{{ layout "section.vto" }}
  {{ slot header }}
    <h1>Section title</h1>
  {{ /slot }}
  <p>Content of the section</p>
{{ /layout }}

You can use pipes to transform the content of a specific slot. In this case, the header variable is converted to upper case:

{{ layout "section.vto" }}
  {{ slot header |> toUpperCase }}
    <h1>Section title</h1>
  {{ /slot }}
  <p>Content of the section</p>
{{ /layout }}

If there are several slots with the same name, the content is concatenated. In this example, the header variable will contain the value of the two slots:

{{ layout "section.vto" }}
  {{ slot header }}<h1>Section title</h1>{{ /slot }}
  {{ slot header }}<h2>Subsection title</h2>{{ /slot }}
  <p>Content of the section</p>
{{ /layout }}

Unslotted content is assigned to the content variable by default. You can also create slots named content, which behaves the same as leaving content unslotted. This approach is useful if you want to apply a pipe or transformation to a specific section of the content:

{{ layout "section.vto" }}
  <p>Unslotted content</p>

  {{ slot content |> toUpperCase}}
    Uppercase content
  {{ /slot }}
{{ /layout }}