beta This component version is ready to be used but is still in active development.

Stack layout

This sets the vertical spacing of child components.

github location npm version

Usage

Most vf-core components come without any margin spacing to avoid adding margins where not needed. Instead vertical spacing is controlled by vf-stack.

Where vertical spacing is required withing a component, the vf-stack class name to existing containers (like vf-hero) or containers you create yourself in your codebase.

Variants

We use CSS custom properties to control this vertical rhythm. For browsers that do not support CSS custom properties (IE 11) we provide a default value of 1rem so that child components get some spacing. This value is overridden by browsers that understand CSS custom properties.

variant name description
200 gives the vertical rhythm equal spacing of .5rem
400 gives the vertical rhythm equal spacing of 1rem
500 gives the vertical rhythm equal spacing of 1.25rem
600 gives the vertical rhythm equal spacing of 1.5rem
800 gives the vertical rhythm equal spacing of 2rem
1200 gives the vertical rhythm equal spacing of 3rem
1600 gives the vertical rhythm equal spacing of 4rem

Even though the vf-stack layout has a default spacing design token applied as a CSS custom property fallback it is good practice in the system to declare the vf-stack spacing class name in your projects.

<div class="vf-stack">...</div>

<div class="vf-stack vf-stack--400">...</div>

As we are using CSS custom properties we can also use a custom value by creating the custom property --vf-stack-margin--custom either in your stylesheet, or in your HTML.

<div class="vf-stack vf-stack--custom" style="--vf-stack-margin--custom: 3em;">
  <div class="vf-box vf-box--normal vf-box-theme--primary">...</div>
  <div class="vf-box vf-box--normal vf-box-theme--primary">...</div>
  <div class="vf-box vf-box--normal vf-box-theme--primary">...</div>
</div>

Variants

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 200,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 200,}
%}
                
HTML
<div class="vf-stack vf-stack--200">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 400,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 400,}
%}
                
HTML
<div class="vf-stack vf-stack--400">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 500,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 500,}
%}
                
HTML
<div class="vf-stack vf-stack--500">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 600,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 600,}
%}
                
HTML
<div class="vf-stack vf-stack--600">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 800,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 800,}
%}
                
HTML
<div class="vf-stack vf-stack--800">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 1200,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 1200,}
%}
                
HTML
<div class="vf-stack vf-stack--1200">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing" : 1600,
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing" : 1600,}
%}
                
HTML
<div class="vf-stack vf-stack--1600">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Did you know?

This is some more content that would be in the box.

Nunjucks syntax

Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

Using include

You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.


{% set context fromYourYamlFile %}
- or -
{% set context = { 
"component-type" : "layout",
"stack__spacing__custom" : "4rem",
"stack__spacing" : "custom",
 }
%}
{% include "../path_to/vf-stack/vf-stack.njk" %}
                

Using render

This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.


{% render '@vf-stack', {
  "component-type" : "layout",
  "stack__spacing__custom" : "4rem",
  "stack__spacing" : "custom",}
%}
                
HTML
<div class="vf-stack vf-stack--custom" style="--vf-stack-margin--custom: 4rem;">


  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

  <div class="vf-box vf-box-theme--primary vf-box--normal">

    <h3 class="vf-box__heading">Did you know?</h3>
    <p class="vf-box__text">This is some more content that would be in the box.</p>
  </div>

</div>
              

Examples

Installation info

This repository is distributed with [npm][https://www.npmjs.com/]. After [installing npm][https://www.npmjs.com/get-npm] and yarn, you can install vf-stack with this command.

$ yarn add --dev @visual-framework/vf-stack

Sass/CSS

If your component uses Sass:

The source files included are written in Sass (scss) You can simply point your sass include-path at your node_modules directory and import it like this.

@import "@visual-framework/vf-stack/index.scss";

Make sure you import Sass requirements along with the modules. You can use a project boilerplate or the vf-sass-starter

Changelog

Changelog

3.0.0

  • With vf-stack more consistently adopted we remove !important and vf-u-fullbleed override. Some spacing regressions are possible.
  • Sets a null vf-stack at the lowest CSS specificity.
  • https://github.com/visual-framework/vf-core/pull/1698

2.1.2

  • vf-stack no longer applies between a vf-hero and vf-u-fullbleed.
  • Gives more margin-top to vf-u-fullbleed after most items.

2.1.1

  • adds usage guideline for include the default vf-stack and the size variant.

2.1.0

  • adds more options: 200,500,1200, and 1600 vertical spaces.

2.0.1

  • changes any set- style functions to cleaner version

2.0.0

  • replaces all spacing / sizing values with new tokens naming convention

1.2.0

  • now uses Nunjucks 'blocks' so we can use this layout more programmatically
  • hides the default Nunjucks file as it renders what looks like a blank page (because it's waiting for the block content)
  • creates separate Nunjucks files to display variants in Fractal
  • updates naming conventions of variables available
  • introduces stack__spacing__custom which will replace custom_spacing_property in the 2.0.0 component release

1.1.1

  • dependency bumps

1.0.0-alpha.1

  • Adds example if statement for setting context

Assets



File system location: components/vf-stack

Find an issue on this page? Propose a change or discuss it.