Tip: The layout grid can be displayed in the preview using the parameter show-grid, for example: /components/preview/colors?show-grid
The vertical spacing is always applied above the elements (margin-top). To automatically adjust the spacing for different viewports, you can use the Sass mixin stack-spacing:
.myElement {
@include stack-spacing();
}
.myComponent {
@include stack-spacing(component);
}
.mySection {
@include stack-spacing(section);
}
.mySpecialEement {
background-color: gray;
@include stack-spacing(default, padding-top);
@include stack-spacing(default, padding-bottom);
}
<!-- Default -->
<!-- Documentation only -->
<section class="doc-section">
<h2 class="doc-section-title">Gestaltungsraster</h2>
<div class="doc-notes">
<p>Auf Desktops basiert das Gestaltungsraster auf 12 Spalten mit einem Spaltenabstand von 40 Pixel und ist in der Breite auf 1366 Pixel beschränkt. Die Breite der Seite an sich ist auf 1680 Pixel beschränkt („Boxed Layout“).</p>
<p>Auf Mobiles wird ein sogenanntes „Gridless Layout“ benutzt. Dabei sind nur der Innenabstand der Seite mit 16 Pixel („Page Padding”) und ein horizontaler Abstand für Elemente in einer Reihe mit 16 Pixel („Gutter“) definiert.</p>
</div>
<div class="grid-section">
<h3 class="doc-header-title">Gleichbreite Spalten mit einer Mindestbreite (Desktop und Mobile)</h3>
<div class="grid-flowbox">
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
<p>Selfies fixie next level trust fund jean shorts photo booth raw denim butcher mixtape ethical mustache.
</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
</section>
</div>
</div>
</div>
<div class="grid-section">
<h3 class="doc-variant-title">Zwei Spalten im Verhältnis 7:5 (Desktop)</h3>
<div class="grid-row">
<div class="span-7 grid-column">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
<p>Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
<p>Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</section>
</div>
<div class="span-5 grid-column">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
</section>
</div>
</div>
</div>
<div class="grid-section">
<h3 class="doc-variant-title">Drei Elemente mit variabler Breite nebeneinander (Desktop und Mobile)</h3>
<div class="grid-flexbox">
<div class="grid-flexbox-item">
<div class="doc-visible-box --sp-component" style="text-align: center">
Hashtag Echo Park selfies
</div>
</div>
<div class="grid-flexbox-item">
<div class="doc-visible-box --sp-component" style="text-align: center">
PBR try-hard skateboard, plaid 8-bit
</div>
</div>
<div class="grid-flexbox-item --sp-component">
<div class="doc-visible-box" style="text-align: center">
Flexitarian retro single-origin coffee
</div>
</div>
</div>
</div>
</section>
<section class="doc-section">
<h2 class="doc-section-title">Vertikale Abstände</h2>
<div class="doc-notes">
<p>Als Basis für den vertikalen Rhythmus sind verschiedene Abstände definiert. Alle Abstände werden in der Regel oberhalb des Elements angewendet (`margin-top`).</p>
<ol>
<li>
<strong>Kleiner Abstand: </strong> z.B. für Elemente einer Liste
</li>
<li>
<strong>Standardabstand: </strong> z.B. für Absätze im Text
</li>
<li>
<strong>Großer Abstand: </strong> z.B. vor Zwischenüberschriften
</li>
<li>
<strong>Komponentenabstand: </strong> z.B. zwischen Elementen einer Sektion
</li>
<li>
<strong>Sektionsabstand: </strong> z.B. zwischen Sektionen eines Inhalts
</li>
</ol>
</div>
</section>
<section class="doc-section">
<div class="grid-row">
<div class="span-6 grid-column">
<section class="grid-section" style="--doc-layout-spacing: var(--sp-section);">
<h2>Sektion</h2>
<p style="--doc-layout-spacing: var(--sp);">Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
<p style="--doc-layout-spacing: var(--sp);">Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
<ul class="ul style=" --doc-layout-spacing: var(--sp);">
</p>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">Hashtag Echo Park selfies</span>
</li>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">PBR try-hard skateboard, plaid 8-bit</span>
</li>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">Flexitarian retro single-origin coffee</span>
</li>
</ul>
<div class="grid-component" style="--doc-layout-spacing: var(--sp-component);">
<h3>Komponente</h3>
<p style="--doc-layout-spacing: var(--sp);">Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</div>
<div class="grid-component" style="--doc-layout-spacing: var(--sp-component);">
<h3>Komponente</h3>
<p style="--doc-layout-spacing: var(--sp);">Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
<p style="--doc-layout-spacing: var(--sp);">Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
<h4 style="--doc-layout-spacing: var(--sp-large);">Zwischenüberschrift</h4>
<p style="--doc-layout-spacing: var(--sp);">Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep. Crucifix you probably haven’t heard of them pork belly tilde, direct trade migas cornhole meggings chambray Vice put a bird on it DIY brunch.
</p>
</div>
</section>
<section class="grid-section" style="--doc-layout-spacing: var(--sp-section);">
<h2>Sektion</h2>
<p style="--doc-layout-spacing: var(--sp);">Cardigan Pinterest gentrify, biodiesel locavore Echo Park bespoke tattooed mlkshk. Master cleanse actually XOXO Schlitz. Four loko disrupt jean shorts meh, normcore vegan tilde vinyl small batch organic Marfa migas Austin Schlitz. Bitters sartorial gastropub, hashtag four loko skateboard chillwave deep.
</p>
</section>
</div>
</div>
</section>
<section class="doc-section">
<h2 class="doc-section-title">Innenabstände</h2>
<div class="grid-flowbox">
<div class="grid-flowbox-item">
<div class="doc-variant">
<header class="doc-header">
<h3 class="doc-header-title">Small</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--bp-small)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-box-padding: var(--bp-small);">
<p>Selfies fixie next level trust fund jean shorts photo booth raw denim butcher mixtape ethical mustache.</p>
</div>
</div>
</div>
<div class="grid-flowbox-item">
<div class="doc-variant">
<header class="doc-header">
<h3 class="doc-header-title">Standard</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--bp)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-box-padding: var(--bp);">
<p>Selfies fixie next level trust fund jean shorts photo booth raw denim butcher mixtape ethical mustache.</p>
</div>
</div>
</div>
<div class="grid-flowbox-item">
<div class="doc-variant">
<header class="doc-header">
<h3 class="doc-header-title">Large</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--bp-large)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-box-padding: var(--bp-large);">
<p>Selfies fixie next level trust fund jean shorts photo booth raw denim butcher mixtape ethical mustache.</p>
</div>
</div>
</div>
</div>
</section>
<section class="doc-section">
<h2 class="doc-section-title">Eckenradii</h2>
<div class="grid-flowbox">
<div class="grid-flowbox-item">
<header class="doc-header">
<h3 class="doc-header-title">Small</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--br-small)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-border-radius: var(--br-small);"></div>
</div>
<div class="grid-flowbox-item">
<header class="doc-header">
<h3 class="doc-header-title">Standard</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--br)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-border-radius: var(--br);"></div>
</div>
<div class="grid-flowbox-item">
<header class="doc-header">
<h3 class="doc-header-title">Large</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>var(--br-large)</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-border-radius: var(--br-large);"></div>
</div>
</div>
</section>
<!-- Default -->
<!-- Documentation only -->
<section class="doc-section">
<h2 class="doc-section-title">Gestaltungsraster</h2>
<div class="doc-notes">
{{#settings}}
<p>Auf Desktops basiert das Gestaltungsraster auf {{columns-count}} Spalten{{#gutter.desktop}} mit einem Spaltenabstand von {{.}} Pixel{{/gutter.desktop}} und ist in der Breite{{#content-max-width}} auf {{{.}}} Pixel {{/content-max-width}}beschränkt.{{#page-max-width}} Die Breite der Seite an sich ist auf {{{.}}} Pixel beschränkt („Boxed Layout“).{{/page-max-width}}</p>
<p>Auf Mobiles wird ein sogenanntes „Gridless Layout“ benutzt. Dabei sind nur der Innenabstand der Seite{{#page-padding.mobile}} mit {{.}} Pixel{{/page-padding.mobile}} („Page Padding”) und ein horizontaler Abstand für Elemente in einer Reihe{{#gutter.mobile}} mit {{.}} Pixel{{/gutter.mobile}} („Gutter“) definiert.</p>
{{/settings}}
</div>
<div class="grid-section">
<h3 class="doc-header-title">Gleichbreite Spalten mit einer Mindestbreite (Desktop und Mobile)</h3>
<div class="grid-flowbox">
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum'}}</p>
<p>{{render '@snippet--lorem-ipsum-short'}}</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum-alt'}}</p>
<p>{{render '@snippet--lorem-ipsum'}}</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum'}}</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum'}}</p>
</section>
</div>
<div class="grid-flowbox-item">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum-alt'}}</p>
</section>
</div>
</div>
</div>
<div class="grid-section">
<h3 class="doc-variant-title">Zwei Spalten im Verhältnis 7:5 (Desktop)</h3>
<div class="grid-row">
<div class="span-7 grid-column">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum'}}</p>
<p>{{render '@snippet--lorem-ipsum-alt'}}</p>
<p>{{render '@snippet--lorem-ipsum'}}</p>
</section>
</div>
<div class="span-5 grid-column">
<section class="grid-section">
<h3 class="heading">Ich bin eine Überschrift</h3>
<p>{{render '@snippet--lorem-ipsum-alt'}}</p>
</section>
</div>
</div>
</div>
<div class="grid-section">
<h3 class="doc-variant-title">Drei Elemente mit variabler Breite nebeneinander (Desktop und Mobile)</h3>
<div class="grid-flexbox">
<div class="grid-flexbox-item">
<div class="doc-visible-box --sp-component" style="text-align: center">
Hashtag Echo Park selfies
</div>
</div>
<div class="grid-flexbox-item">
<div class="doc-visible-box --sp-component" style="text-align: center">
PBR try-hard skateboard, plaid 8-bit
</div>
</div>
<div class="grid-flexbox-item --sp-component">
<div class="doc-visible-box" style="text-align: center">
Flexitarian retro single-origin coffee
</div>
</div>
</div>
</div>
</section>
{{#settings.stack-spacings}}
<section class="doc-section">
<h2 class="doc-section-title">{{{title}}}</h2>
<div class="doc-notes">
<p>Als Basis für den vertikalen Rhythmus sind verschiedene Abstände definiert. Alle Abstände werden in der Regel oberhalb des Elements angewendet (`margin-top`).</p>
<ol>
{{#variants}}
<li>
<strong>{{{label}}}{{#if description}}: {{/if}}</strong>{{#description}} {{{.}}}{{/description}}
</li>
{{/variants}}
</ol>
</div>
</section>
<section class="doc-section">
<div class="grid-row">
<div class="span-6 grid-column">
<section class="grid-section" style="--doc-layout-spacing: var(--sp-section);">
<h2>Sektion</h2>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum'}}</p>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum-alt'}}</p>
<ul class="ul style="--doc-layout-spacing: var(--sp);"></p>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">Hashtag Echo Park selfies</span>
</li>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">PBR try-hard skateboard, plaid 8-bit</span>
</li>
<li style="--doc-layout-spacing: var(--sp-small);">
<span class="ul-li">Flexitarian retro single-origin coffee</span>
</li>
</ul>
<div class="grid-component" style="--doc-layout-spacing: var(--sp-component);">
<h3>Komponente</h3>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum'}}</p>
</div>
<div class="grid-component" style="--doc-layout-spacing: var(--sp-component);">
<h3>Komponente</h3>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum-alt'}}</p>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum'}}</p>
<h4 style="--doc-layout-spacing: var(--sp-large);">Zwischenüberschrift</h4>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum-alt'}}</p>
</div>
</section>
<section class="grid-section" style="--doc-layout-spacing: var(--sp-section);">
<h2>Sektion</h2>
<p style="--doc-layout-spacing: var(--sp);">{{render '@snippet--lorem-ipsum'}}</p>
</section>
</div>
</div>
</section>
{{/settings.stack-spacings}}
{{#settings.box-paddings}}
<section class="doc-section">
<h2 class="doc-section-title">{{{title}}}</h2>
<div class="grid-flowbox">
{{#variants}}
<div class="grid-flowbox-item">
<div class="doc-variant">
<header class="doc-header">
<h3 class="doc-header-title">{{{label}}}</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>{{value}}</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-box-padding: {{value}};">
{{render '@snippet--p-alt'}}
</div>
</div>
</div>
{{/variants}}
</div>
</section>
{{/settings.box-paddings}}
{{#settings.border-radii}}
<section class="doc-section">
<h2 class="doc-section-title">{{{title}}}</h2>
<div class="grid-flowbox">
{{#variants}}
<div class="grid-flowbox-item">
<header class="doc-header">
<h3 class="doc-header-title">{{{label}}}</h3>
<div class="doc-header-configuration">
<ul data-label="Value">
<li>{{value}}</li>
</ul>
</div>
</header>
<div class="doc-sample" style="--doc-border-radius: {{value}};"></div>
</div>
{{/variants}}
</div>
</section>
{{/settings.border-radii}}
/* Default: No context defined. */
/* Documentation only */
{
"settings": {
"columns-count": 12,
"gutter": {
"desktop": 40,
"mobile": 16
},
"page-max-width": 1680,
"page-padding": {
"mobile": 16
},
"content-max-width": 1366,
"stack-spacings": {
"title": "Vertikale Abstände",
"variants": [
{
"name": "small",
"value": "var(--sp-small)",
"label": "Kleiner Abstand",
"description": "z.B. für Elemente einer Liste"
},
{
"name": "default",
"value": "var(--sp)",
"label": "Standardabstand",
"description": "z.B. für Absätze im Text"
},
{
"name": "default",
"value": "var(--sp-large)",
"label": "Großer Abstand",
"description": "z.B. vor Zwischenüberschriften"
},
{
"name": "component",
"value": "var(--sp-component)",
"label": "Komponentenabstand",
"description": "z.B. zwischen Elementen einer Sektion"
},
{
"name": "section",
"value": "var(--sp-section)",
"label": "Sektionsabstand",
"description": "z.B. zwischen Sektionen eines Inhalts"
}
]
},
"box-paddings": {
"title": "Innenabstände",
"variants": [
{
"name": "small",
"value": "var(--bp-small)",
"label": "Small"
},
{
"name": "default",
"value": "var(--bp)",
"label": "Standard"
},
{
"name": "large",
"value": "var(--bp-large)",
"label": "Large"
}
]
},
"border-radii": {
"title": "Eckenradii",
"variants": [
{
"name": "small",
"value": "var(--br-small)",
"label": "Small"
},
{
"name": "default",
"value": "var(--br)",
"label": "Standard"
},
{
"name": "large",
"value": "var(--br-large)",
"label": "Large"
}
]
}
}
}
@mixin has-max-width(
$max-width: $_page_max-width,
){
max-width: $max-width;
}
@mixin has-full-width(
$max-width: $_page_max-width,
){
width: 100vw;
width: calc(100vw - var(--scrollbar-width, 0));
@if $max-width {
max-width: $max-width;
}
position: relative;
left: 50%;
transform: translateX(-50%);
}
@mixin has-limited-width(
$max-width: $_page_max-width,
){
@include page-padding();
@include only-on-large-desktop {
max-width: $_page_content_max-width !important;
}
@include only-on-desktop(){
margin-left: auto;
margin-right: auto;
&:not(.has-limited-wrapper),
&.has-limited-wrapper > .wrapper {
max-width: $max-width;
}
}
}
@mixin has-limited-wrapper(
$wrapper-class: ".wrapper",
$max-width: $_page_max-width,
){
& > #{$wrapper-class} {
padding-left: $_page_padding--mobile;
padding-right: $_page_padding--mobile;
margin-left: auto;
margin-right: auto;
}
@include only-on-desktop(){
& > #{$wrapper-class} {
max-width: $max-width;
padding-left: $_page_padding;
padding-right: $_page_padding;
}
}
}
@mixin full-width-backdrop(
$background: var(--backdrop-color, $_backdrop-color),
$pseudo-element: before,
$max-width: $_page_max-width,
$set-position: true,
$set-padding: false,
){
background-color: transparent;
@if $set-position {
position: relative;
}
@if $set-padding {
@include backdrop-padding();
}
&::#{$pseudo-element} {
content: "";
display: block;
width: 101vw;
width: calc(100vw + 1px); // Fix backdrop offset on odd screen resolutions
height: 100%;
@if $max-width {
max-width: $max-width;
}
position: absolute;
top: 0; left: 50%;
transform: translateX(-50%);
z-index: -1;
background: $background;
background-size: cover;
}
}
@mixin backdrop-padding() {
padding-top: var(--backdrop-padding);
padding-bottom: var(--backdrop-padding);
}
//----------------//
//----- Grid -----//
//----------------//
@function get-flowbox-item-min-width(
$max-columns: 4,
$grid_min-width: $_page_content_max-width,
$gutter: $_grid_gutter,
){
@return math.floor(math.div($grid_min-width - (($max-columns - 1) * $gutter), $max-columns));
}
@mixin grid-flowbox(
$min-width: $_grid_item_min-width,
$max-columns: null,
$stack-spacing: var(--gg, $_grid_gutter),
){
@if $max-columns != null {
@if $max-columns < 3 {
$min-width: get-flowbox-item-min-width(
$max-columns: 3,
) + 1;
} @else {
$min-width: get-flowbox-item-min-width(
$max-columns: $max-columns,
);
}
}
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, $min-width), 1fr));
grid-auto-flow: row;
gap: $stack-spacing var(--gg, #{$_grid_gutter});
align-items: start;
> .has-full-width {
grid-column: 1 / -1;
}
}
@mixin grid-row(
$gutter: null,
){
display: flex;
@if $gutter != null {
column-gap: $gutter;
} @else {
column-gap: $_grid_gutter;
}
}
@mixin grid-column(
$ratio: 0,
$centered: false,
){
@if $ratio == 0 {
// If witdh is not set, balance width of all columns in a row.
flex: 1;
} @else {
flex: 0 1 auto;
width: get-column-width($ratio);
}
@if ($centered){
margin-left: auto;
margin-right: auto;
}
}
//----- Widths -----//
@function get-column-width(
$fraction: 1
){
$width: 100%;
@if $fraction != 1 {
$width: calc((100% + var(--gg)) * #{$fraction} - var(--gg));
}
@return $width;
}
@mixin column-width(
$fraction: 1,
$gutter-fallback: 2%,
){
@if $fraction == 1 {
width: 100%;
} @else {
width: ((100% + $gutter-fallback) * $fraction - $gutter-fallback); // Fallback
width: get-column-width($fraction);
}
}
@function get-columns-width(
$span: 1,
$columns: $_grid_columns_count,
){
$fraction: math.div($span, $columns);
@return get-column-width($fraction);
}
@mixin columns-width(
$span: 1,
$columns: $_grid_columns_count,
$gutter-fallback: 2%,
){
@if $columns != $_grid_columns_count {
$fraction: math.div($span, $columns);
@include column-width($fraction, $gutter-fallback: $gutter-fallback);
} @else {
@include columns-span($span);
}
}
@function get-column-indent(
$columns: $_grid_columns_count,
){
// Get calculated value to indent element one single column
@return get-columns-indent(1, $columns);
}
@function get-columns-indent(
$span: 0,
$columns: $_grid_columns_count,
){
// Get calculated value to indent element n columns
@if $span == 0 {
@return 0;
}
$indent: 0;
@if $columns != $_grid_columns_count {
$indent: calc((100% + var(--gg)) * #{math.div($span, $columns)});
} @else {
$indent: calc(var(--span-#{$span}) + var(--gg));
}
@return $indent;
}
@mixin columns-indent(
$span: 1,
$columns: $_grid_columns_count,
$property: margin-left,
){
#{$property}: get-columns-indent($span, $columns);
}
@function get-column-spans(
$columns: $_grid_columns_count,
){
$grid_spans--default: ();
$grid_spans--desktop: ();
@for $span from 1 to $columns {
$width: get-columns-width($span, $columns);
$grid_spans--desktop: map.merge($grid_spans--desktop, (#{$span}: $width));
$grid_spans--default: map.merge($grid_spans--default, (#{$span}: "auto"));
};
@return (
default: $grid_spans--default,
desktop: $grid_spans--desktop,
);
}
//----- Miscellaneous -----//
@mixin only-last-row(
$column-count: 1
){
// Select elements in last row of a grid with "$column-count" columns
// ------------------------------------------------------------------
// Thanks to Hugh Grigg
// https://www.hughgrigg.com/posts/css-select-last-grid-row/
&:nth-of-type(#{$column-count}n+1):nth-last-of-type(-n+#{$column-count}),
&:nth-of-type(#{$column-count}n+1):nth-last-of-type(-n+#{$column-count}) ~ * {
@content;
}
}
//---- Deprecated ----//
@mixin set-column-width(
$fraction: 1
){
// Deprecated: Please use column-width():
@include column-width($fraction);
}
//-----------------------//
//----- Breakpoints -----//
//-----------------------//
@mixin only-on-mobile(){
@include media-query(
$max-width: $_breakpoint--tablet - 1
){
@content;
}
}
@mixin not-on-mobile(){
@include media-query(
$min-width: $_breakpoint--tablet
){
@content;
}
}
@mixin only-on-tablet(){
@include media-query(
$min-width: $_breakpoint--tablet,
$max-width: $_breakpoint--desktop - 1
){
@content;
}
}
@mixin not-on-tablet(){
@include only-on-mobile(){
@content;
}
@include only-on-desktop(){
@content;
}
}
@mixin only-on-desktop(){
@include media-query(
$min-width: $_breakpoint--desktop
){
@content;
}
}
@mixin not-on-desktop(){
@include media-query(
$max-width: $_breakpoint--desktop - 1
){
@content;
}
}
@mixin only-on-small-desktop(
$max-width: $_breakpoint--small-desktop,
){
@if ($max-width == auto) {
$max-width: (.5 * $_page_max-width + .5 * $_breakpoint--desktop - 1)
}
@include media-query(
$min-width: $_breakpoint--desktop,
$max-width: $max-width,
){
@content;
}
}
@mixin only-on-large-desktop(
$min-width: $_breakpoint--small-desktop + 1,
){
@if ($min-width == auto) {
$min-width: (0.5 * $_page_max-width + 0.5 * $_breakpoint--desktop);
}
@include media-query(
$min-width: $min-width,
){
@content;
}
}
@mixin media-query(
$min-width: 0,
$max-width: none
){
@if ($min-width == 0) and ($max-width == none){
@content;
}
@else if ($min-width == 0){
@media (max-width: $max-width){
@content;
}
}
@else if ($max-width == none){
@media (min-width: $min-width){
@content;
}
}
@else {
@media (min-width: $min-width) and (max-width: $max-width) {
@content;
}
}
}
//----- Fallback for Bootstrap’s grid mixins -----//
@mixin media-breakpoint-down($breakpoint) {
@if $breakpoint == "sm" {
@include only-on-mobile(){
@content;
};
} @else if $breakpoint == "md" {
@include not-on-desktop(){
@content;
};
}
}
@mixin media-breakpoint-up($breakpoint) {
@if $breakpoint == "md" {
@include not-on-mobile(){
@content;
};
}
@if $breakpoint == "lg" {
@include only-on-desktop(){
@content;
};
}
}
//-----------------------//
//----- Grid gutter -----//
//-----------------------//
@mixin grid-gutter(
$variant: default,
$property: (padding-left, padding-right),
$factor: 1,
$gutters: $_grid_gutters
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$variables: $gutters,
$factor: $factor,
$prefix: "--gg",
);
}
//------------------------//
//----- Column Spans -----//
//------------------------//
@mixin columns-span(
$variant: null,
$property: width,
$factor: 1,
$spans: $_grid_spans
){
@if $variant == null {
#{$property}: auto;
} @else {
@include responsive-variable(
$variant: $variant,
$property: $property,
$variables: $spans,
$factor: $factor,
$prefix: "--span",
);
}
}
//------------------------//
//----- Page padding -----//
//------------------------//
@mixin page-padding(
$variant: default,
$property: (padding-left, padding-right),
$factor: 1,
$paddings: $_page_paddings
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$factor: $factor,
$variables: $paddings,
$prefix: "--pp",
);
}
//-------------------------//
//----- Stack spacing -----//
//-------------------------//
@mixin stack-spacing(
$variant: default,
$property: margin-top,
$factor: 1,
$spacings: $_stack-spacings
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$factor: $factor,
$variables: $spacings,
$prefix: "--sp",
);
}
//-------------------------//
//----- Scroll Margin -----//
//-------------------------//
@mixin scroll-margin(
$variant: default,
$property: scroll-margin-top,
$factor: 1,
$margins: $_scroll-margins
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$factor: $factor,
$variables: $margins,
$prefix: "--scroll-margin",
);
}
//-----------------------//
//----- Box padding -----//
//-----------------------//
@mixin box-padding(
$variant: default,
$property: padding,
$factor: 1,
$paddings: $_box_paddings
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$factor: $factor,
$variables: $paddings,
$prefix: "--bp",
);
}
//-------------------------//
//----- Border radius -----//
//-------------------------//
@mixin border-radius(
$variant: default,
$property: border-radius,
$factor: 1,
$radii: $_border-radii
){
@include responsive-variable(
$variant: $variant,
$property: $property,
$factor: $factor,
$variables: $radii,
$prefix: "--br",
);
}
//--------------------//
//----- Layering -----//
//--------------------//
@function get-z-index(
$layer-name: "",
$base: 100,
) {
@if $layer-name == "" or not index($_layers, $layer-name) {
@return $base;
}
$z-index: $base;
@each $layer in $_layers {
$z-index: $z-index + 1;
@if $layer-name == $layer {
@return $z-index;
}
}
}
@mixin z-index(
$layer-name: "",
){
z-index: get-z-index($layer-name);
}
import {revealCloakedItems, setScrollbarWidth, setViewport} from "./_layout.script";
revealCloakedItems();
setViewport();
setScrollbarWidth();
function revealCloakedItems() {
document.querySelectorAll("[js-cloak]").forEach((element) => {
element.removeAttribute("js-cloak");
});
}
function setScrollbarWidth() {
const width = window.innerWidth - document.documentElement.clientWidth;
document.documentElement.style.setProperty('--scrollbar-width', `${width}px`);
}
function setViewport() {
const defaults = {
debugging: false,
metatag: {
value: "width=device-width, initial-scale=1, shrink-to-fit=yes, viewport-fit=cover"
}
};
const breakpoints = [
{
breakpoint: 0,
},
{
breakpoint: 640,
min_width: 1024
},
{
breakpoint: 1024,
},
];
const getViewportMetatag = function(breakpoint){
let metatag = document.createElement("meta");
metatag.setAttribute("name", "viewport");
// Set value of metagtag
let content = defaults.metatag.value;
if (typeof breakpoint.min_width === "number"){
content = "width=" + breakpoint.min_width + ", shrink-to-fit=yes, viewport-fit=cover";
}
metatag.setAttribute("content", content);
return metatag;
}
const removeViewportMetatags = function (){
for (let metatags = document.getElementsByTagName("meta"), i = metatags.length - 1; i >= 0; i--){
if (metatags[i].getAttribute("name") === "viewport"){
metatags[i].remove();
}
}
}
const attachViewportMetatag = function (breakpoint){
// Remove old viewport metatag(s)
removeViewportMetatags();
// Create new viewport metatag
let metatag = getViewportMetatag(breakpoint);
// Append metatag to head
document.head.appendChild(metatag);
if (defaults.debugging){
showMessage("Set viewport to: " + metatag.getAttribute("content"));
}
}
const showMessage = function(content) {
let container = document.createElement("pre");
container.setAttribute("class", "message");
container.innerHTML = content;
document.body.appendChild(container);
}
const getBreakpoint = function(){
// Only run script on mobile devices
if (typeof window.onorientationchange === "undefined"){
return;
}
// Check breakpoints in descending order
let breakpoint = 0;
for (let i = breakpoints.length - 1; i >= 0; i--){
if (document.documentElement.clientWidth > breakpoints[i].breakpoint){
breakpoint = breakpoints[i].breakpoint;
attachViewportMetatag(breakpoints[i]);
break;
}
}
return breakpoint;
}
const current_breakpoint = getBreakpoint();
// Reload on orientation changes
window.addEventListener("orientationchange", function() {
const html = document.querySelector("html");
html.style.opacity = 0;
// Set viewport to default `width=device-width`
attachViewportMetatag(breakpoints[0]);
setTimeout(
function(){
if (typeof current_breakpoint === "undefined" || getBreakpoint() !== current_breakpoint){
// If breakpoint changes then reload page
window.location.reload();
}
html.style.opacity = 1;
},
50
);
}, false);
}
export {
revealCloakedItems,
setScrollbarWidth,
setViewport,
}
@import "_layout.tokens";
@import "_layout.helpers";
$_grid_gutter: 40px !default;
$_page_content_max-width: 1366px !default;
$_narrow-content_max-width: 480px !default;
$_page_padding--mobile: 1rem !default;
$_grid_gutter--mobile: $_page_padding--mobile !default;
$_scrollbar-width: 15px !default;
$_viewport_background-color: $_gray-100 !default;
$_grid_item_min-width: get-flowbox-item-min-width(3) !default;
$_stack-spacing: 0.8rem !default;
$_stack-spacing--mobile: 0.75rem !default;
$_stack-spacings: (
default: (
default: $_stack-spacing,
small: (.5 * $_stack-spacing),
large: (2 * $_stack-spacing),
component: (4 * $_stack-spacing),
section: (8 * $_stack-spacing),
),
mobile: (
default: $_stack-spacing--mobile,
small: (.5 * $_stack-spacing--mobile),
large: (1.5 * $_stack-spacing--mobile),
component: (2 * $_stack-spacing--mobile),
section: (4 * $_stack-spacing--mobile),
),
) !default;
$_box_padding: 1.2rem !default;
$_box_padding--small: (.667 * $_box_padding) !default;
$_box_padding--large: $_grid_gutter !default;
$_box_padding--mobile: 1.25rem !default;
$_box_padding--small--mobile: (.6 * $_box_padding--mobile) !default;
$_box_padding--large--mobile: (1.4 * $_box_padding--mobile) !default;
$_border-radius: 8px !default;
$_border-radius--mobile: 6px !default;
$_border-width: 3px !default;
$_border-width--large: 6px !default;
$_border-width--largest: 9px !default;
$_border-width--mobile: 2px !default;
$_border-width--large--mobile: 4px !default;
$_border-width--largest--mobile: 6px !default;
$_border-widths: (
default: (
small: 1px,
default: $_border-width,
large: $_border-width--large,
largest: $_border-width--largest,
),
mobile: (
small: 1px,
default: $_border-width--mobile,
large: $_border-width--large--mobile,
largest: $_border-width--largest--mobile,
),
) !default;
$_border-radii: (
default: (
default: $_border-radius,
small: round(.75 * $_border-radius),
large: round(1.5 * $_border-radius),
),
mobile: (
default: $_border-radius--mobile,
small: round(.67 * $_border-radius--mobile),
large: round(1.67 * $_border-radius--mobile),
),
) !default;
$_border: var(--bw) var(--border-color, #{$_gray-300}) solid;
$_layers: (
intrapageNav,
ctaInset,
filterPanel,
siteHeader,
mediaOverlay,
) !default;
@import "_layout.settings";
@import "_layout.styles";
// Set min height of main content
%grid-container {
min-height: calc(100vh - var(--sp-section));
display: flex;
flex-direction: column;
}
%grid-container .mainContent {
flex-grow: 1;
}
//***** Backdrop *****//
%has-fullwidth-backdrop {
& + &,
& + [id] > &:first-child { // Special case for Typo3 markup
margin-top: -1px !important;
}
&[data-theme="dark"] + &[data-theme="dark"],
&[data-theme="accent"] + &[data-theme="accent"] {
padding-top: 0;
}
&[data-theme] { // Fix glitch in Fire Fox
background-color: transparent;
}
}
.has-backdrop {
@extend %has-fullwidth-backdrop;
}
//***** Special cases for stack spacing *****//
*:has(> .has-backdrop:last-child) + * > .has-backdrop:first-child {
@include stack-spacing(0);
}
.featureSection.has-backdrop[data-theme="dark"] + .pageSection:has(> .has-backdrop[data-theme="dark"]) {
@include stack-spacing(0);
> .has-backdrop[data-theme="dark"] {
margin-top: calc(-1 * var(--sp-section));
}
}
// Nested elements with backdrop
.has-backdrop > .has-backdrop:last-child {
margin-bottom: calc(-1 * var(--sp-section));
}
.pageSection.has-backdrop .dataInset.has-backdrop,
.pageSection.has-backdrop .dataInset.has-intro {
padding-top: 0;
}
// Themed data inset without Title
.has-backdrop + .dataInset[data-theme]:has(.dataInset-items:first-child),
.dataInset[data-theme] + .has-backdrop {
@include stack-spacing(0);
}
div[id]:has(> .quoteInset) + .richtextBlock,
.has-backdrop + .richtextBlock {
@include stack-spacing(section);
}
.ul > .copy.is-standfirst {
@include stack-spacing(component);
}
.mockupInset + .richtextBlock {
@include stack-spacing(section);
}
.pageSection-title + .formInset + .teaserList {
@include stack-spacing(component);
}
$_grid_gutter: 32px !default;
//----------------//
//----- Page -----//
//----------------//
$_viewport_background-color: #eee !default;
$_viewport_background: null !default;
$_page_max-width: 1680px !default; // To get full width layout, set $_page_max-width to `none`.
$_page_content_max-width: 1366px !default;
$_page_padding: $_grid_gutter !default;
$_page_padding--mobile: 1rem !default;
$_page_box-shadow: 0 0 20px rgba(black, .05), 0 0 5px rgba(black, .1) !default;
$_scrollbar-width: 15px !default;
//----- Horizontal grid ----/
$_grid_gutter--mobile: $_page_padding--mobile !default;
$_grid_columns_count: 12 !default;
$_grid_spans: get-column-spans();
$_grid_item_min-width: get-flowbox-item-min-width() !default;
$_breakpoint--tablet: 640px !default;
$_breakpoint--desktop: 1024px !default;
$_breakpoint--small-desktop: auto !default; // To set breakpoint automatically, set $_breakpoint--small-desktop to `auto`.
//----- Vertical spacing -----//
$_stack-spacing: 1rem !default;
$_stack-spacing--mobile: 1rem !default;
$_stack-spacings: (
default: (
small: (.5 * $_stack-spacing),
default: $_stack-spacing,
large: (1.5 * $_stack-spacing),
component: (2 * $_stack-spacing),
section: (4 * $_stack-spacing),
),
mobile: (
small: (.5 * $_stack-spacing--mobile),
default: $_stack-spacing--mobile,
large: (1.5 * $_stack-spacing--mobile),
component: (2 * $_stack-spacing--mobile),
section: (4 * $_stack-spacing--mobile),
),
) !default;
$_scroll-margin: map.get(map.get($_stack-spacings, default), section) !default;
$_scroll-margin--mobile: map.get(map.get($_stack-spacings, mobile), section) !default;
$_scroll-margins: (
default: (
default: $_scroll-margin,
),
mobile: (
default: $_scroll-margin--mobile,
),
) !default;
//----- Boxes -----//
$_box_padding: 1rem !default;
$_box_padding--mobile: $_box_padding !default;
$_box_padding--small: (.5 * $_box_padding) !default;
$_box_padding--small--mobile: (.5 * $_box_padding--mobile) !default;
$_box_padding--large: (2 * $_box_padding) !default;
$_box_padding--large--mobile: (2 * $_box_padding--mobile) !default;
$_box_paddings: (
default: (
default: $_box_padding,
small: $_box_padding--small,
large: $_box_padding--large,
),
mobile: (
default: $_box_padding--mobile,
small: $_box_padding--small--mobile,
large: $_box_padding--large--mobile,
),
) !default;
$_border-radius: 8px !default;
$_border-radius--mobile: 6px !default;
$_border-radii: (
default: (
default: $_border-radius,
small: .5 * $_border-radius,
large: 1.5 * $_border-radius,
),
mobile: (
default: $_border-radius--mobile,
small: .5 * $_border-radius--mobile,
large: 1.5 * $_border-radius--mobile,
),
) !default;
$_border-width: 1px !default;
$_border-width--mobile: 1px !default;
$_border-widths: (
default: (
default: $_border-width,
),
mobile: (
default: $_border-width--mobile,
),
) !default;
$_backdrop-padding: map.get(map.get($_stack-spacings, default), section) !default;
$_backdrop-padding--mobile: map.get(map.get($_stack-spacings, mobile), section) !default;
$_backdrop-paddings: (
default: (
default: $_backdrop-padding,
),
mobile: (
default: $_backdrop-padding--mobile,
),
);
//----- Layering -----//
$_layers: (
) !default;
//----- Calculated variables ----/
@if ($_page_max-width != none){
$_page_padding: .5 * ($_page_max-width - $_page_content_max-width);
// If $_page_content_max-width is greater than $_page_max-width
@if ($_page_content_max-width > $_page_max-width - 2 * $_grid_gutter) {
$_page_content_max-width: $_page_max-width - 2 * $_grid_gutter;
}
}
@if ($_breakpoint--small-desktop == auto){
$_breakpoint--small-desktop: ($_page_content_max-width + 2 * $_grid_gutter);
}
$_page_paddings: (
default: (
default: $_page_padding,
),
small-desktop: (
default: (.5 * $_page_padding),
),
mobile: (
default: $_page_padding--mobile,
),
) !default;
$_grid_gutters: (
default: (
default: $_grid_gutter,
),
small-desktop: (
default: $_grid_gutter,
),
mobile: (
default: $_grid_gutter--mobile,
),
) !default;
//***** Legacy *****//
$_stack-spacing: map.get(map.get($_stack-spacings, default), default) !default;
$_stack-spacing--small: map.get(map.get($_stack-spacings, default), small) !default;
$_stack-spacing--large: map.get(map.get($_stack-spacings, default), large) !default;
$_stack-spacing--component: map.get(map.get($_stack-spacings, default), component) !default;
$_stack-spacing--section: map.get(map.get($_stack-spacings, default), section) !default;
$_stack-spacing--mobile: map.get(map.get($_stack-spacings, mobile), default) !default;
$_stack-spacing--small--mobile: map.get(map.get($_stack-spacings, mobile), small) !default;
$_stack-spacing--large--mobile: map.get(map.get($_stack-spacings, mobile), large) !default;
$_stack-spacing--component--mobile: map.get(map.get($_stack-spacings, mobile), component) !default;
$_stack-spacing--section--mobile: map.get(map.get($_stack-spacings, mobile), section) !default;
:root {
--scrollbar-width: #{$_scrollbar-width};
& {
@include responsive-variables(
$set: $_box_paddings,
$prefix: --bp
);
}
& {
@include responsive-variables(
$set: $_grid_gutters,
$prefix: --gg
);
}
& {
@include responsive-variables(
$set: $_grid_spans,
$prefix: --span
);
}
& {
@include responsive-variables(
$set: $_page_paddings,
$prefix: --pp
);
}
& {
@include only-on-small-desktop {
--pp: #{$_grid_gutter};
}
}
& {
@include only-on-large-desktop {
--pp: 0;
}
}
& {
@include responsive-variables(
$set: $_border-widths,
$prefix: --bw
);
}
& {
@include responsive-variables(
$set: $_border-radii,
$prefix: --br
);
}
& {
@include responsive-variables(
$set: $_stack-spacings,
$prefix: --sp
);
}
& {
@include responsive-variables(
$set: $_scroll-margins,
$prefix: --scroll-margin
);
}
& {
@include responsive-variables(
$set: $_backdrop-paddings,
$prefix: --backdrop-padding
);
}
@each $layer in $_layers {
--z-index--#{$layer}: #{get-z-index($layer)};
}
}
//-----------------------//
//----- Page Layout -----//
//-----------------------//
html {
overflow-x: hidden;
min-height: 100%; min-width: 100%;
height: auto;
background-color: $_viewport_background-color;
@if meta.global_variable_exists(_viewport_background){
background: $_viewport_background;
}
@supports (overflow-y: clip) {
overflow-x: clip;
}
}
body {
@extend %grid-page;
@if meta.global_variable_exists(_page_box-shadow) and $_page_box-shadow != none {
box-shadow: $_page_box-shadow;
}
}
h1, h2, h3, h4, h5, h6, p, blockquote,
table, caption,
address, big, dl, ol, ul,
form, fieldset, legend,
img {
@include stack-spacing();
margin-bottom: 0;
}
// Scroll margin
[id]:target {
scroll-margin: var(--scroll-margin);
}
// Hide items before Scripts are loaded
[js-cloak] {
display: none;
}
//***** Grid *****//
.grid-section {
margin-top: $_stack-spacing--section--mobile;
@include only-on-desktop(){
margin-top: $_stack-spacing--section;
}
}
.grid-component {
margin-top: $_stack-spacing--component--mobile;
&:first-child {
margin-top: 0;
}
@include only-on-desktop(){
margin-top: $_stack-spacing--component;
}
}
//----- Modifier classes for setting width ----/
.has-full-width {
@include has-full-width();
}
.has-limited-width {
@include has-limited-width();
}
.has-limited-wrapper {
@include has-limited-wrapper();
}
//----------------//
//----- Grid -----//
//----------------//
%grid-page {
min-height: 100%;
min-height: 100vh;
max-width: $_page_max-width;
margin: -1px auto 0 !important;
padding-bottom: var(--sp-section);
position: relative;
z-index: 1;
// Force to cover margin of first child
border-top: 1px solid transparent;
// Clip overflowing content (on modern browsers)
overflow-x: clip;
}
.grid-page {
@extend %grid-page;
}
%grid-container {
@include has-limited-width();
}
.grid-container {
@extend %grid-container;
}
//----- Global attributes ----/
.grid-flowbox {
@include grid-flowbox();
}
.grid-flexbox {
display: flex;
column-gap: var(--gg);
flex-wrap: wrap;
& > * {
flex: 1 1 auto;
}
& > *:not(&-item) {
width: 100%;
}
}
@include only-on-desktop(){
%grid-row {
@include grid-row();
&.is-centered {
justify-content: center;
}
%grid-column {
@include grid-column();
}
}
}
.grid-row {
@extend %grid-row;
.grid-column {
@extend %grid-column;
}
}
//----- Rows with a fixed number of columns ----/
//----- e.g. `.row.with-3-columns .column` ----/
@include only-on-desktop(){
%grid-row {
$spans: 2, 3, 4, 6 !default;
@for $i from 1 through list.length($spans) {
$count: list.nth($spans, $i);
&.with-#{$count}-columns {
flex-wrap: wrap;
%grid-column {
@include grid-column(math.div(1, $count));
}
}
}
}
}
//----- Rows with a fixed number of columns and ratio ----/
//----- e.g. `.row.with-ratio-2-1 .column` ----------*/
@include only-on-desktop(){
$ratios: (
2 1,
1 2,
7 5,
5 7,
3 1,
1 3
);
@if meta.type-of(list.nth($ratios, 1)) != "list" {
// If `$ratios` is not a list of ratios, convert it
$ratios: list.append((), $ratios, comma);
}
@for $i from 1 through list.length($ratios) {
$ratio: list.nth($ratios, $i);
$count: list.length($ratio);
$total: 0;
$selector: ".with-ratio";
@for $j from 1 through list.length($ratio){
$total: $total + list.nth($ratio, $j);
$selector: "#{$selector}-#{list.nth($ratio, $j)}"
}
%grid-row {
flex-wrap: wrap;
&#{$selector} {
%grid-column {
@for $j from 1 through list.length($ratio){
$cols: list.nth($ratio, $j);
&:nth-child(#{$j}n){
@include grid-column(math.div($cols, $total));
}
}
}
}
}
}
}
//----- Elements with a span over n of $_grid_columns_count columns ----/
//----- e.g. `span-6 grid-column` --------------------------/
%grid-row {
@for $i from 1 through $_grid_columns_count {
%grid-column.span-#{$i} {
flex: 0 1 auto;
@include columns-width($i);
}
}
@include only-on-desktop(){
@for $i from 1 through $_grid_columns_count {
.indent-#{$i} {
margin-left: (math.div($i, $_grid_columns_count) * 100%);
}
}
}
}
//----- Placeholder for width of one of n elements ----/
@for $i from 1 through $_grid_columns_count {
%one-of-#{$i} {
width: math.div(math.floor(math.div(100, $i) * 100%), 100);
}
}
@for $i from 1 through $_grid_columns_count {
%grid-row {
.is-one-of-#{$i} {
@extend %one-of-#{$i};
}
}
}
//--* Visually hide elements -----//
//-- Thanks to https://www.scottohara.me/blog/2017/04/14/inclusively-hidden.html --//
%visually-hidden:not(:focus):not(:active) {
position: absolute;
width: 1px;
height: 1px;
clip: rect(0 0 0 0);
clip-path: inset(50%);
overflow: hidden;
white-space: nowrap;
}
%is-visually-hidden { // Deprecated: Use "%visually-hidden"
@extend %visually-hidden;
}
.is-visually-hidden {
@extend %is-visually-hidden;
}
//----- Utility classes -----//
.--bp {
@each $name, $value in map.get($_box_paddings, default) {
$variant: '';
@if $name != default {
$variant: '-#{$name}';
}
&#{$variant} {
padding: $value !important;
padding: var(--bp#{$variant}) !important;
}
}
@each $name, $value in map.get($_box_paddings, default) {
$variant: '';
@if $name != default {
$variant: '-#{$name}';
}
&-top#{$variant} {
padding-top: $value !important;
padding-top: var(--bp#{$variant}) !important;
}
&-bottom#{$variant} {
padding-bottom: $value !important;
padding-bottom: var(--bp#{$variant}) !important;
}
&-left#{$variant} {
padding-left: $value !important;
padding-left: var(--bp#{$variant}) !important;
}
&-right#{$variant} {
padding-right: $value !important;
padding-right: var(--bp#{$variant}) !important;
}
}
}
.--sp {
&-none {
margin-top: 0 !important;
}
@each $name, $value in map.get($_stack-spacings, default) {
$variant: '';
@if $name != default {
$variant: '-#{$name}';
}
&#{$variant} {
margin-top: $value !important;
margin-top: var(--sp#{$variant}) !important;
}
}
}
$_grid_gutter: null !default;
$_page_padding: null !default;
@if variable-exists(grid-desktop) and type-of($grid-desktop) == "map"{
@if map-has-key($grid-desktop, gutter) {
$_grid_gutter: map-get($grid-desktop, gutter);
}
@if map-has-key($grid-desktop, page-padding) {
$_page_padding: map-get($grid-desktop, page-padding);
}
}
$_grid_gutter--mobile: null !default;
$_page_padding--mobile: null !default;
@if variable-exists(grid-mobile) and type-of($grid-mobile) == "map"{
@if map-has-key($grid-mobile, gutter) {
$_grid_gutter--mobile: map-get($grid-mobile, gutter);
}
@if map-has-key($grid-mobile, page-padding) {
$_page_padding--mobile: map-get($grid-mobile, page-padding);
}
}
$_grid_gutter--tablet: null !default;
$_page_padding--tablet: null !default;
@if variable-exists(grid-tablet) and type-of($grid-tablet) == "map"{
@if map-has-key($grid-tablet, gutter) {
$_grid_gutter--tablet: map-get($grid-tablet, gutter);
}
@if map-has-key($grid-tablet, page-padding) {
$_page_padding--tablet: map-get($grid-mobile, page-padding);
}
}