alpha

This version is in early development and is subject to change and therefore not ready for wide use. There may be other stable versions available.

Card Container container

A multi-column container for vf-card.

github location npm version

Usage

Section header

  • Use one card container for all cards that belong to the same section.
  • Always include a vf-section header to the card container. This ensures that your page will not have skipped headings between the cards and the preceding content outside the container.
  • If you do not want the section header to be visible, you can hide it by passing hidden as true (hidden: true) inside the container_section__header section in card container config.yml setting. This value (true) applies the class vf-u-sr-only (for screen reader only) to the section header and hides it. See the example with the hidden header below.
  • Hiding the heading can only be applied to a section header that is not a link (i.e. the default variant). Section headers that act as links should not be hidden because when users navigate with the keyboard the header is selected as a link but it will not be visible to them.

Card container background

  • Use a white background for both striped (green) cards and bordered (white) cards.
  • vf-u-background-color-ui--grey--light (which is called 'Gray lightest' in the equivalent WP block) may be used as an alternative background of bordered (white) cards, especially when the section header is hidden and there is no text between the section header and the cards.

Columns

The containier defaults to three columns (the recommended number of image-based cards per row). However if text-only cards are being used, a 4-column variant is supported cards_per_row: 4 which appends CSS class vf-card-container__col-4.

CSS Custom Properties

The vf-card component allows for a CSS custom property to be set to define the aspect-ratio of the card image. This can be set per card, but with the vf-card-container you should aim for consistency across the vf-cards it is displaying. Therefore we can pass the aspect-ratio value from this component and it will cascade through the CSS onto the cards. This is encapsulated to this container, which allows you to set different aspect-ratio values for different containers as needed.

To set the aspect-ratio you will need to set the card_custom_aspect_ratio key/value pair in the .yml or the {#{% render %}#} api of the vf-card-container as needed.

Accessibility

This component targets WCAG 2.1 AA accessibility.

Pages that use this component

The Meet our people page at the EMBL-EBI site includes examples of the card container that pass the basic contrast tests for accessibility.

Variants

To promote molecular biology across Europe

To create a centre of excellence for Europe's leading young molecular biologists

One card

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos? Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?

A card here

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

Another card

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?

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": "container",
  "modifier": "vf-u-background-color-ui--white vf-u-fullbleed",
  "cards_aspect_ratio": "16 / 9",
  "cards_per_row": 3,
  "container_section__header": {
    "section_title": "Missions",
    "href": "JavaScript:Void(0);",
    "vf_section__content": [
      "To promote molecular biology across Europe",
      "To create a centre of excellence for Europe's leading young molecular biologists"
    ]
  },
  "vf_cards": [
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "One card",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos? Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?"
    },
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "A card here",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit."
    },
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "Another card",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?"
    }
  ]
}
 %}
{% include "../path_to/vf-card-container/vf-card-container.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-card-container', {
  "component-type": "container",
  "modifier": "vf-u-background-color-ui--white vf-u-fullbleed",
  "cards_aspect_ratio": "16 / 9",
  "cards_per_row": 3,
  "container_section__header": {
    "section_title": "Missions",
    "href": "JavaScript:Void(0);",
    "vf_section__content": [
      "To promote molecular biology across Europe",
      "To create a centre of excellence for Europe's leading young molecular biologists"
    ]
  },
  "vf_cards": [
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "One card",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos? Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?"
    },
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "A card here",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit."
    },
    {
      "variant": "bordered",
      "newTheme": "primary",
      "card_title": "Another card",
      "card_href": "JavaScript:Void(0);",
      "card_image": "../../assets/vf-card/assets/vf-card-example.png",
      "card_text": "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?"
    }
  ]
} %}
                
HTML
<section class="vf-card-container vf-card-container__col-3 | vf-u-background-color-ui--white vf-u-fullbleed" style="--vf-card__image--aspect-ratio: 16 / 9;">
  <div class="vf-card-container__inner">
    <div class="vf-section-header">
      <h2 class="vf-section-header__heading vf-section-header__heading--is-link"><a href="JavaScript:Void(0);">Missions</a><svg aria-hidden="true" class="vf-section-header__icon | vf-icon vf-icon-arrow--inline-end" width="1em" height="1em" xmlns="http://www.w3.org/2000/svg">
          <path d="M0 12c0 6.627 5.373 12 12 12s12-5.373 12-12S18.627 0 12 0C5.376.008.008 5.376 0 12zm13.707-5.209l4.5 4.5a1 1 0 010 1.414l-4.5 4.5a1 1 0 01-1.414-1.414l2.366-2.367a.25.25 0 00-.177-.424H6a1 1 0 010-2h8.482a.25.25 0 00.177-.427l-2.366-2.368a1 1 0 011.414-1.414z" fill="" fill-rule="nonzero"></path>
        </svg></h2>
      <p class="vf-section-header__text">To promote molecular biology across Europe</p>
      <p class="vf-section-header__text">To create a centre of excellence for Europe's leading young molecular biologists</p>
    </div>


    <article class="vf-card vf-card--brand vf-card--bordered">

      <img src="../../assets/vf-card/assets/vf-card-example.png" alt="" class="vf-card__image" loading="lazy">
      <div class="vf-card__content | vf-stack vf-stack--400">
        <h3 class="vf-card__heading"><a class="vf-card__link" href="JavaScript:Void(0);">One card <svg aria-hidden="true" class="vf-card__heading__icon | vf-icon vf-icon-arrow--inline-end" width="1em" height="1em" xmlns="http://www.w3.org/2000/svg">
              <path d="M0 12c0 6.627 5.373 12 12 12s12-5.373 12-12S18.627 0 12 0C5.376.008.008 5.376 0 12zm13.707-5.209l4.5 4.5a1 1 0 010 1.414l-4.5 4.5a1 1 0 01-1.414-1.414l2.366-2.367a.25.25 0 00-.177-.424H6a1 1 0 010-2h8.482a.25.25 0 00.177-.427l-2.366-2.368a1 1 0 011.414-1.414z" fill="currentColor" fill-rule="nonzero"></path>
            </svg>
          </a></h3>
        <p class="vf-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos? Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</p>
      </div>
    </article>



    <article class="vf-card vf-card--brand vf-card--bordered">

      <img src="../../assets/vf-card/assets/vf-card-example.png" alt="" class="vf-card__image" loading="lazy">
      <div class="vf-card__content | vf-stack vf-stack--400">
        <h3 class="vf-card__heading"><a class="vf-card__link" href="JavaScript:Void(0);">A card here <svg aria-hidden="true" class="vf-card__heading__icon | vf-icon vf-icon-arrow--inline-end" width="1em" height="1em" xmlns="http://www.w3.org/2000/svg">
              <path d="M0 12c0 6.627 5.373 12 12 12s12-5.373 12-12S18.627 0 12 0C5.376.008.008 5.376 0 12zm13.707-5.209l4.5 4.5a1 1 0 010 1.414l-4.5 4.5a1 1 0 01-1.414-1.414l2.366-2.367a.25.25 0 00-.177-.424H6a1 1 0 010-2h8.482a.25.25 0 00.177-.427l-2.366-2.368a1 1 0 011.414-1.414z" fill="currentColor" fill-rule="nonzero"></path>
            </svg>
          </a></h3>
        <p class="vf-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
      </div>
    </article>



    <article class="vf-card vf-card--brand vf-card--bordered">

      <img src="../../assets/vf-card/assets/vf-card-example.png" alt="" class="vf-card__image" loading="lazy">
      <div class="vf-card__content | vf-stack vf-stack--400">
        <h3 class="vf-card__heading"><a class="vf-card__link" href="JavaScript:Void(0);">Another card <svg aria-hidden="true" class="vf-card__heading__icon | vf-icon vf-icon-arrow--inline-end" width="1em" height="1em" xmlns="http://www.w3.org/2000/svg">
              <path d="M0 12c0 6.627 5.373 12 12 12s12-5.373 12-12S18.627 0 12 0C5.376.008.008 5.376 0 12zm13.707-5.209l4.5 4.5a1 1 0 010 1.414l-4.5 4.5a1 1 0 01-1.414-1.414l2.366-2.367a.25.25 0 00-.177-.424H6a1 1 0 010-2h8.482a.25.25 0 00.177-.427l-2.366-2.368a1 1 0 011.414-1.414z" fill="currentColor" fill-rule="nonzero"></path>
            </svg>
          </a></h3>
        <p class="vf-card__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</p>
      </div>
    </article>
  </div>
</section>
              

Examples

Missions

To promote molecular biology across Europe

To create a centre of excellence for Europe's leading young molecular biologists

One card

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos? Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?

A card here

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

Another card

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?

Installation info

This repository is distributed with npm. After installing npm, you can install vf-card-container with this command.

$ yarn add --dev @visual-framework/vf-card-container

Sass/CSS

The style files included are written in Sass. If you're using a VF-core project, you can import it like this:

@import "@visual-framework/vf-card-container/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.2.2

  • Added: Attribute ‘hidden’ to container_section__header in config and accordingly it adds ‘vf-u-sr-only’ css class to hide section header, this to fix component accessibility
  • Added: Added condition to components.njk to show example section for type=container
  • Changed: vf-u-background-color--grey--lightest to vf-u-background-color-ui--white to apply white background
  • https://github.com/visual-framework/vf-core/pull/1851

3.2.1

  • Uses vf-stack for spacing to apply to elements immediately before or after vf-card-container.
  • Removes spacing between fullbleed card containers and fullbleed items (footers, heroes)
  • https://github.com/visual-framework/vf-core/pull/1698

3.2.0

  • Fix README formatting.
  • Halves vertical spacing between vf-section-header and vf-cards.
  • Refines container vertical by using --page-grid-gap).
  • Adds 4 column card support for when cards have no imagery.

3.1.2

  • Updates example to use content of different lengths.

3.1.1

  • fixes issue in README that made fractal fail to load the container example.

3.1.0

  • adds ability to define the aspect-ratio of the vf-card child components
  • moves the default context data in the .yml file to a variant to allow easier use of ``.

3.0.2

  • update card sizes to make 3 columns
  • adds --vf-card-container__grid--size--overide CSS custom property in CSS
  • adds --vf-card-container__grid--size--overide as .yml option

3.0.1

  • updates max-width of component

3.0.0-alpha.1

  • makes vf-section-header work as a subcomponent
  • changes async for a for loop
  • adds contextual data changes if context is passed

2.0.0

  • makes better use of using .yml for data rather than having to inline it in a vf-card
  • better default spacing

1.0.0-alpha.2

  • Tweaks layout centring

1.0.0-alpha.1 (2020-01-28)

  • Corrects YAML template usage

1.0.0-alpha.0 (2020-01-24)

  • Initial release

Assets



File system location: components/vf-card-container

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