There are currently two types of card component that can be used for your projects. Each card component requires the additional modifier class to be added into either your .yml file or directly into the HTML.
The cards are available in two styled varieties: bordered and striped. To avoid visual confusion it is recommended to use one variant in a container.
As the striped variant makes use of the brand colour it is recommended not to use this when displayed in a container that has a background colour.
A striped card must always have a heading (vf-card__heading).
The vf-card is one of the most popular ways to feature content, however it is not always the best way.
As a general rule:
vf-card to feature a range of different categories (to display event types)vf-summary for a list of the same type of content (a list of upcoming events)vf-hero to indicate a singular theme of content for a pageThe vf-card should look like it's around the same size as card from an average set of playing cards.
The vf-card can take a variety optional of content:
| Content type | .njk / .yml variable |
CSS class | Description |
|---|---|---|---|
| image | card_image |
vf-card__image |
|
| alt text | card_image__alt |
||
| aspect ratio | card_custom_aspect_ratio |
||
| heading | card_heading |
vf-card__heading |
|
| link | card_href |
vf-card__link |
|
| subheading | card_subheading |
vf-card__subheading |
|
| text | card_text |
vf-card__text |
For browsers that support the CSS aspect-ratio property we provide the option to stipulate the images aspect ratio in a card using a CSS custom property. By default, if no CSS custom property is set, the aspect ratio is 8 / 4. This can be set on the individual cards using the nunjucks 'key' in the .yml or with the {#{% render %}#} api using the variable card_custom_aspect_ratio.
--vf-card__image--aspect-ratio: 16 / 9;
As of version 2.7.3 vf-card has experimental React support which has been tested on react version 20.20.2
yarn add @visual-framework/vf-cardimport VfCard from '@visual-framework/vf-card/vf-card.jsx';
Make sure you have the jsx support enabled with babel. Alternatively, you can also copy the vf-card.react.js file from below to your react project and import as per the location.
<VfCard
card_image="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg"
card_image__alt="Image alt text"
card_heading="A Bordered Card Heading"
card_subheading="With sub–heading"
card_text={<>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</>}
variant="bordered"
newTheme="primary"
card_href="JavaScript:Void(0);"/>
@import '~@visual-framework/vf-sass-config/index.scss';
@import '~@visual-framework/vf-card/vf-card.css';
you should also install and import vf-sass-starter for the stylesUsage:
<VfCard
card_image="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg"
card_image__alt="Image alt text"
card_heading="A Bordered Card Heading"
card_subheading="With sub–heading"
card_text={<>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</>}
variant="bordered"
newTheme="primary"
card_href="JavaScript:Void(0);"
/>
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
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.
includeYou'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" : "block",
"card_heading" : "A Bordered Card Heading",
"card_subheading" : "With sub–heading",
"variant" : "bordered",
"newTheme" : "primary",
"card_href" : "JavaScript:Void(0);",
"card_image" : "https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg",
"card_text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?",
"card_image__alt" : "Image alt text",
}
%}
{% include "../path_to/vf-card/vf-card.njk" %}
renderThis 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', {
"component-type" : "block",
"card_heading" : "A Bordered Card Heading",
"card_subheading" : "With sub–heading",
"variant" : "bordered",
"newTheme" : "primary",
"card_href" : "JavaScript:Void(0);",
"card_image" : "https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg",
"card_text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?",
"card_image__alt" : "Image alt text",
}
%}
<VfCard card_image="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg" card_image__alt="Image alt text" card_heading="A Bordered Card Heading" card_subheading="With sub–heading" card_text={<>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</>} variant="bordered" newTheme="primary" card_href="JavaScript:Void(0);" />
<article class="vf-card vf-card--brand vf-card--bordered">
<img src="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg" alt="Image alt text" 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 Bordered Card Heading <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__subheading">With sub–heading</p>
<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>
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
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.
includeYou'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" : "block",
"card_heading" : "A Striped Card Heading",
"card_subheading" : "With sub–heading",
"variant" : "striped",
"newTheme" : "primary",
"card_href" : "JavaScript:Void(0);",
"card_image" : "https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg",
"card_text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?",
"card_image__alt" : "Image alt text",
}
%}
{% include "../path_to/vf-card/vf-card.njk" %}
renderThis 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', {
"component-type" : "block",
"card_heading" : "A Striped Card Heading",
"card_subheading" : "With sub–heading",
"variant" : "striped",
"newTheme" : "primary",
"card_href" : "JavaScript:Void(0);",
"card_image" : "https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg",
"card_text" : "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?",
"card_image__alt" : "Image alt text",
}
%}
<VfCard card_image="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg" card_image__alt="Image alt text" card_heading="A Striped Card Heading" card_href="JavaScript:Void(0);" card_subheading="With sub–heading" card_text={<>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?</>} variant="striped" newTheme="primary" />
<article class="vf-card vf-card--brand vf-card--striped">
<img src="https://acxngcvroo.cloudimg.io/v7/https://www.embl.org/files/wp-content/uploads/2020/04/SCHOOLS_1011_ells-learninglab_hd_01_Cool_500px.jpg" alt="Image alt text" 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 Striped Card Heading <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__subheading">With sub–heading</p>
<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>
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
With sub–heading
With sub–heading
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
With sub–heading
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente harum, omnis provident saepe aut eius aliquam sequi fugit incidunt reiciendis, mollitia quos?
This repository is distributed with npm. After installing npm, you can install vf-card with this command.
$ yarn add --dev @visual-framework/vf-card
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/index.scss";
Make sure you import Sass requirements along with the modules. You can use a project boilerplate or the vf-sass-starter
vf-card__link Tracking issuevf-stack custom properties to work nicely with vf-stack version 3.@visual-framework@vf-sass-config@2.6.1.word-break: break-word; to text so the text won't exceed the box model.align-content: start;.align-items: start; to the card so all child align when in a card container.set- style functions to cleaner versionvf-card__image height in Safari.grid-template-rows as it's difficult to define now cards do not have to have images.--vf-card__image--aspect-ratio CSS custom property to help with the initial image height.vf-section-header when the heading has a linkvf-stack with vf-card__content.--bordered and --striped design variants.vf-stack to the vf-card__content element to determine spacing.vf-stack for older components.newTheme so the 'Mortal Kombat' variants can live side-by-side with news versions for now.newTheme moves us back to the 'primary' being the embl green, the secondary the embl blue, etc.-theme part of the css class moving forward as it's cleaner, easier to read, and states the same thing without it.--easy variant.vf-card__image height in safariobject-position: center for imagecard_title--medium variants--very-easy variant
File system location: components/vf-card
Find an issue on this page? Propose a change or discuss it.
Are you sure you want to close the chat?
Your current conversation history will be permanently deleted.