/**
* @namespace Grid
*/
/**
* @namespace Grid:grid-container
*/
/**
* Renders the basic properties of a grid container, which is the bracket element for elements, which are
* to be placed in a grid, thereby making the container, more or less, "the grid itself".
*
* The basic characteristic of this container is the pre-definition of usable grid columns, according to our config.
*
* @memberof Grid:grid-container
* @function
* @name grid-container
* @alias grid-container
*
* @see grid-item
*
* @example
* \@include grid-container();
*/
@mixin grid-container(){
display: grid;
grid-auto-flow: row;
grid-template-columns: repeat(map-get($jig---grid-config, 'columns'), 1fr);
@include attributes-for-breakpoints((
'grid-column-gap' : map-get-deep($jig---grid-config, 'gutters', 'horizontal'),
'grid-row-gap' : map-get-deep($jig---grid-config, 'gutters', 'vertical')
));
}
/**
* @namespace Grid:grid-item
*/
/**
* Renders the basic properties of a grid item, which is an item inside a grid, being placed according to
* pre-defined columns.
*
* The main purpose of this mixin is, to define the space, the item takes inside the grid. To do this, there are
* several means of definition. Either just giving it a column-based width, aligning it at the end of other,
* already existing items, or defining a specific area it should cover, by explicitly defining a start and end column
* or a combination of both.
*
* Additionally, the item may also be defined to take up more than one row, adding the native grid capabilities to
* our concepts.
*
* @memberof Grid:grid-item
* @function
* @name grid-item
* @alias grid-item
*
* @param {?Number} [$span=null] - the width of the item in columns
* @param {?Number} [$start=null] - the horizontal start offset of the item in columns, may be combined with end or span
* @param {?Number} [$end=null] - the horizontal end offset of the item in columns, may be combined with start or span
* @param {?Number} [$row-span=null] - the height of the item in rows
* @param {?Number} [$row-start=null] - the vertical start offset of the item in rows, may be combined with row-end or row-span
* @param {?Number} [$row-end=null] - the vertical end offset of the item in rows, may be combined with row-start or row-span
*
* @see grid-container
* @see grid-item-align
*
* @example
* \@include grid-item(12);
* \@include grid-item(6, 6);
* \@include grid-item(null, 2, 2);
* \@include grid-item(6, null, null, 2);
* \@include grid-item(6, null, null, null, 0, 5);
*/
@mixin grid-item(
$span:null,
$start:null,
$end:null,
$row-span:null,
$row-start:null,
$row-end:null
){
@if ($span == null) and ($start == null) {
grid-column-end: span map-get($jig---grid-config, 'columns');
} @else {
@if $span != null {
grid-column-end: span $span;
}
@if $start != null {
grid-column-start: $start + 1;
}
@if ($end != null) and ($span == null) {
grid-column-end: $end + 1;
}
}
@if ($row-span != null) or ($row-start != null) {
@if $row-span != null {
grid-row-end: span $row-span;
}
@if $row-start != null {
grid-row-start: $row-start + 1;
}
@if ($row-end != null) and ($row-span == null) {
grid-row-end: $row-end + 1;
}
}
}
/**
* @namespace Grid:grid-item-align
*/
/**
* Renders properties of a grid item, to define the item's alignment inside the area defined for the item using
* the grid-item mixin. The usage of this only make sense for grid items.
*
* @memberof Grid:grid-item-align
* @function
* @name grid-item-align
* @alias grid-item-align
*
* @param {String} [$horizontal=null] - "left"/"start", "right"/"end", "middle"/"center" or "full"/"stretch"
* @param {String} [$vertical=null] - "top"/"start", "bottom"/"end", "middle"/"center" or "full"/"stretch"
*
* @see grid-item
*
* @example
* \@include grid-item-align('left');
* \@include grid-item-align(center, center);
* \@include grid-item-align(null, 'full');
*/
@mixin grid-item-align($horizontal:null, $vertical:null){
@if $horizontal == 'left' {
$horizontal: 'start';
} @else if $horizontal == 'right' {
$horizontal: 'end';
} @else if $horizontal == 'middle' {
$horizontal: 'center';
} @else if $horizontal == 'full' {
$horizontal: 'stretch';
}
@if $vertical == 'top' {
$vertical: 'start';
} @else if $vertical == 'bottom' {
$vertical: 'end';
} @else if $vertical == 'middle' {
$vertical: 'center';
} @else if $vertical == 'full' {
$vertical: 'stretch';
}
@if $horizontal != null {
justify-self: unquote($horizontal);
}
@if $vertical != null {
align-self: unquote($vertical);
}
}
/**
* @namespace Grid:gutter-value
*/
/**
* Returns the value of the defined distance between two columns/rows for a breakpoint.
*
* The main usage for this is, to define a property value based on the current gutter.
* This is why the parameter order may seem flipped, but usually, you'd use this inside a breakpoint
* using auto-breakpoint detection, primarily rather working with the value itself. For other cases:
* Remember, that that you can simply use named parameters.
*
* @memberof Grid:gutter-value
* @function
* @name gutter-value
* @alias gutter-value
*
* @param {String} [$direction='horizontal'] - either "horizontal" or "vertical", determines the gutter direction in the grid
* @param {String} [$breakpoint='auto'] - a defined breakpoint name or "auto", to use the current breakpoint at the point of usage
* @returns {Number} the determined gutter value with applied factor and/or addition
* @throws error if no gutter value could be determined, based on given breakpoint and/or direction
*
* @example
* \@include breakpoint(medium){
* padding-left: gutter-value() * 0.5;
* }
* margin-top: gutter-value($direction:'vertical', $breakpoint:'small');
*/
@function gutter-value($direction:'horizontal', $breakpoint:'auto'){
$gutter: map-get-deep($jig---grid-config, 'gutters', $direction);
$res: null;
@if $gutter != null {
@if type-of($gutter) == 'map' {
$res: breakpoint-value($gutter, $breakpoint);
} @else {
$res: $gutter;
}
}
@if $res == null {
@error 'jig:gutter-value | could not resolve gutter, check direction and/or breakpoint';
}
@return $res;
}