Skip to main content

Grid Ready

Grid component provides structure for other components using Flexbox based layout system. Grid allows nesting and defining the direction of the content.

While the Grid Item component makes it possible set additional parameters for Grid’s cells, this component can be used without <duet-grid-item/> as well. In that case the direct child elements of Grid will be considered as Grid cells.

Examples #

Open in new window
<duet-grid responsive class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive distribution="center" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive distribution="right" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive distribution="space-between" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive distribution="space-around" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive distribution="space-evenly" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="top" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="center" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="bottom" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="stretch" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="baseline" class="grid-demo">
<duet-grid-item
><div style="line-height: 1.2">Grid Item<br />with multiple<br />rows of text.</div></duet-grid-item
>

<duet-grid-item><div style="line-height: 7">Grid Item</div></duet-grid-item>
<duet-grid-item><div style="line-height: 3">Grid Item</div></duet-grid-item>
</duet-grid>
Open in new window
<duet-grid grid-template="medium">
<duet-card>
<duet-button id="bnError">Toggle long error messages</duet-button>
<duet-paragraph>
Long error messages will push <code>&lt;duet-grid-item&gt;</code> too wide unless it has <code>fill</code> attribute.
You can also add input elements directly inside <code>&lt;duet-grid&gt;</code> without using <code>&lt;duet-grid-item&gt;</code>.
</duet-paragraph>
</duet-card>
<duet-card padding="large">
<duet-fieldset label="Valitse aikaväli">
<duet-grid responsive alignment="form_distribute">
<duet-grid-item fill>
<duet-date-picker
name="startdate"
class="start"
expand
margin="none"
label="Label"
id="input0"
caption="test"
value="2020-06-01"
error="test"
>
</duet-date-picker>
</duet-grid-item>
<duet-grid-item>
<duet-icon class="icon-arrow" name="navigation-arrow-right" color="currentColor" size="x-small"></duet-icon>
</duet-grid-item>
<duet-grid-item fill>
<duet-date-picker
name="enddate"
class="end"
expand
margin="none"
label="Label"
direction="left"
value="2020-06-10"
error="this is a is a long error"
>
</duet-date-picker>
</duet-grid-item>
</duet-grid>

<hr />
<duet-grid responsive alignment="form_distribute">
<duet-grid-item>
<duet-input name="enddate" class="end" margin="none" label="Label" expand value="input"></duet-input>
</duet-grid-item>

<duet-grid-item>
<duet-date-picker
name="startdate"
class="start"
id="input2"
margin="none"
label="Label "
expand
caption="Grid item here does not have 'fill' attribute"
value="2020-06-01"
error="test"
>
</duet-date-picker>
</duet-grid-item>
</duet-grid>

<hr />
<duet-grid responsive alignment="form_distribute">
<duet-grid-item fill>
<duet-input
name="enddate"
id="input3"
class="end"
label="Label"
margin="none"
caption="caption"
expand
value="input"
>
</duet-input>
</duet-grid-item>
<duet-grid-item fill>
<duet-paragraph>some simple text</duet-paragraph>
</duet-grid-item>
</duet-grid>

<duet-grid responsive alignment="form_distribute">
<duet-grid-item fill>
<duet-input name="enddate" class="end" margin="none" label="Label" expand value="input" error="Something wrong happened here"></duet-input>
</duet-grid-item>
<duet-grid-item fill>
<duet-select id="duet-select_default_select" label="Kaupunki" placeholder="Valitse" margin="none"></duet-select>
</duet-grid-item>
</duet-grid>

<hr />

<duet-grid responsive alignment="form_distribute">
<duet-input name="inputone" id="input1" label="Lorem ipsum" value="input" error="Something wrong happened here."></duet-input>
<duet-input name="inputtwo" label="Lorem ipsum dolor sit amet, apendisic ellit." value="input"></duet-input>
</duet-grid>
<hr />
<duet-grid responsive alignment="form_distribute">
<duet-grid-item>
<duet-input name="enddate" class="end" margin="none" label="Label" expand value="input" error="Something wrong happened here"></duet-input>
</duet-grid-item>

<duet-grid-item>
<duet-button variation="primary" margin="none">Submit</duet-button>
</duet-grid>
</duet-fieldset>
</duet-card>
</duet-grid>

<script>
const i0= document.querySelector("#input0")
const i1= document.querySelector("#input1")
const i2= document.querySelector("#input2")
const i3= document.querySelector("#input3")
const bnError= document.querySelector("#bnError")

bnError.onclick = toggleErrors

var hasErrors = false
function toggleErrors(){
hasErrors=!hasErrors
i0.error = hasErrors ? "this is a super long error this is a super long error this is a super long error this is a super long error this is a super long error" : undefined ;
i1.error = hasErrors ? "this is a super long error this is a super long error this is a super long error this is a super long error this is a super long error" : "Something wrong happened here.";
i2.error = hasErrors ? "this is a super long error this is a super long error this is a super long error this is a super long error this is a super long error" : undefined ;
i3.error = hasErrors ? "this is a super long error this is a super long error this is a super long error this is a super long error this is a super long error" : undefined ;
}

</script>
Open in new window
<duet-grid responsive alignment="stretch" class="grid-demo">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="stretch" class="grid-demo">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item min-width="300px">Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="stretch" class="grid-demo">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive row-reverse breakpoint="small">
<duet-grid-item>
<duet-button variation="primary">Next</duet-button></duet-grid-item>
<duet-grid-item>
<duet-button>Prev</duet-button>
</duet-grid-item>
<duet-grid-item fill>
<duet-button variation="plain">Cancel</duet-button>
</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive direction="vertical" class="grid-demo">
<duet-grid-item>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid responsive alignment="stretch" class="grid-demo">
<duet-grid-item fill>
<duet-grid responsive alignment="stretch">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
</duet-grid>
</duet-grid-item>
<duet-grid-item>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-layout center margin="none">
<div slot="main">
<duet-card padding="large" margin="none">
<div>
<duet-choice-group value="one" label="Asiointikieli" direction="horizontal" name="group" responsive>
<duet-choice label="Suomi" type="radio" value="one" expand></duet-choice>
<duet-choice label="Svenska" type="radio" value="two" expand></duet-choice>
<duet-choice label="English" type="radio" value="three" expand></duet-choice>
</duet-choice-group>
</div>
<duet-grid responsive>
<duet-input label="Etunimi" placeholder="Matti" expand></duet-input>
<duet-input label="Sukunimi" placeholder="Meikäläinen" expand></duet-input>
</duet-grid>
<duet-input label="Katuosoite" placeholder="Kotikatu 123" expand></duet-input>
<duet-grid responsive>
<duet-input label="Postinumero" placeholder="00100"></duet-input>
<duet-input label="Kaupunki" placeholder="Helsinki" expand></duet-input>
</duet-grid>
<duet-grid responsive>
<duet-input label="Postinumero" placeholder="00100" expand></duet-input>
<duet-input label="Kaupunki" placeholder="Helsinki"></duet-input>
</duet-grid>
<duet-grid responsive>
<duet-input label="Postinumero" placeholder="00100" expand></duet-input>
<duet-grid-item min-width="calc(33.333% + 8px)"></duet-grid-item>
</duet-grid>
</duet-card>
</div>
</duet-layout>
Open in new window
<duet-grid responsive breakpoint="medium" alignment="stretch" class="grid-demo">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
</duet-grid>
<duet-grid responsive breakpoint="x-large" alignment="stretch" class="grid-demo">
<duet-grid-item fill>Grid Item<br />with multiple<br />rows of text.</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
<duet-grid-item fill>Grid Item</duet-grid-item>
</duet-grid>
Open in new window
<duet-grid grid-template="small">
<duet-card margin="none">small (1)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="medium">
<duet-card margin="none">medium (1)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="large">
<duet-card margin="none">large (1)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="sidebar-right">
<duet-card margin="none">sidebar-right (1)</duet-card>
<duet-card margin="none">(2)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="sidebar-left">
<duet-card margin="none">sidebar-left (1)</duet-card>
<duet-card margin="none">(2)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="two-columns">
<duet-card margin="none">two-columns (1)</duet-card>
<duet-card margin="none">(2)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="three-columns">
<duet-card margin="none">three-columns (1)</duet-card>
<duet-card margin="none">(2)</duet-card>
<duet-card margin="none">(3)</duet-card>
</duet-grid>
<duet-divider></duet-divider>
<duet-grid grid-template="large">
<duet-paragraph>large with nested button-grid</duet-paragraph>
<duet-grid grid-template="button-grid">
<duet-link variation="button" icon="action-buy-insurance"
url="https://www.duetds.com"
margin="none">
Basic button link</duet-link>
<duet-link variation="button" icon="action-buy-insurance"
url="https://www.duetds.com"
margin="none">
Basic button link</duet-link>
<duet-link variation="button" icon="action-buy-insurance"
url="https://www.duetds.com"
margin="none">
Basic button link</duet-link>
<duet-link variation="button" icon="action-buy-insurance"
url="https://www.duetds.com"
margin="none">
Basic button link</duet-link>
<duet-link variation="button" icon="action-buy-insurance"
url="https://www.duetds.com"
margin="none">
Basic button link</duet-link>
</duet-grid>
</duet-grid>

Properties #

Property Attribute Description Type Default
alignment alignment Adjusts the vertical alignment of the grid items, if set to "form_distribute" the grid will try to calculate correct paddings for any duet-input fields inside duet-grid-items, so that they align even when displaying errors. "baseline" | "bottom" | "center" | "form_distribute" | "stretch" | "top" "top"
breakpoint breakpoint Switch the breakpoint used to trigger the content stacking. These match to similar media query tokens: $media-query-small and $media-query-medium. "large" | "medium" | "small" | "x-large" | "x-small" "small"
direction direction Direction of the grid items. "horizontal" | "vertical" "horizontal"
distribution distribution Adjusts the horizontal distribution of the grid items. "center" | "default" | "left" | "right" | "space-around" | "space-between" | "space-evenly" "default"
gridTemplate grid-template CSS grid based templates that can be used to create pre-defined layouts. "button-grid" | "large" | "medium" | "sidebar-left" | "sidebar-right" | "small" | "three-columns" | "two-columns" null
mobile mobile Adjusts the horizontal alignment of the grid items on mobile (575px and under). "" | "auto" | "center" | "left" | "right" ""
responsive responsive Enable or disable the automatic responsive behaviour of the grid component. Setting this option to "true" makes sure that contents are stacked vertically on mobile (575px and under). boolean false
rowReverse row-reverse Reverse the order of the grid items when horizontal. Usefull when we want the primary item to be on bottom right on desktop, but on top on mobile and the first for screen readers. boolean false

Usage #

This section includes guidelines for designers and developers about the usage of this component in different contexts.

When to use #

  • When you need to provide structure for other components using Flexbox based layout system.
  • When you need to stack multiple components vertically or horizontally.

When not to use #

Accessibility #

This component has been validated to meet the WCAG 2.1 AA accessibility guidelines. You can find additional information regarding accessibility of this component below.


Integration

For integration, event and theming guidelines, please see Using Components. This documentation explains how to implement and use Duet’s components across different technologies like Angular, React or Vanilla JavaScript.

Integration guidelines


Tutorials

Follow these practical tutorials to learn how to build simple page layouts using Duet’s CSS Framework, Web Components and other features:

Tutorials

Building Layouts

Tutorials

Using CLI Tools

Tutorials

Creating Custom Patterns

Tutorials

Server Side Rendering

Tutorials

Sharing Prototypes

Tutorials

Usage With Markdown


Troubleshooting

If you experience any issues while using a component, please head over to the Support page for more guidelines and help.