@use 'sass:list'; @use 'sass:math'; /* @include layout(column, [ ("m" "full" ( ((0 0) (0 0) (1 1) (0 0)) (0 50%) ), (0 "m" ( ((0 0)) (100% 100%) ) ], (1rem 1rem)); @include layout($flex-direction, [ ($bpMinWidth $bpMaxWidth ( ((flex:), ...)) ((minmax:)) ) ], (gapRow gapColumn); */ @mixin layout($direction, $bpColumns: [], $gap: (0 0)) { display: flex; justify-content: space-between; flex-direction: $direction; align-items: stretch; align-content: stretch; flex-wrap: wrap; $columnGap: list.nth($gap, 1); $rowGap: 0; @if list.length($gap) == 2 { $rowGap: list.nth($gap, 2); } column-gap: $columnGap; row-gap: $rowGap; & > * { flex: 0 0 auto; } @if list.length($bpColumns) > 0 { @for $bpIndex from 1 through list.length($bpColumns) { $bp: list.nth($bpColumns, $bpIndex); @include breakpoint('screen', list.nth($bp, 1), list.nth($bp, 2)) { @if list.length($bp) >= 3 { $flex: list.nth($bp, 3); @for $i from 1 through list.length($flex) { $flexGrowShrink: list.nth($flex, $i); $grow: 0; $shrink: 0; @if list.length($flexGrowShrink) >= 1 { $grow: list.nth($flexGrowShrink, 1); } @if list.length($flexGrowShrink) == 2 { $shrink: list.nth($flexGrowShrink, 2); } $length: list.length($flex); $childs: $length + 'n+' + $i; & > *:nth-child(#{$childs}) { flex: $grow $shrink auto; } } } @if list.length($bp) == 4 { $columns: list.nth($bp, 4); @for $i from 1 through list.length($columns) { $minmax: list.nth($columns, $i); $min: list.nth($minmax, 1); $max: $min; @if list.length($minmax) == 2 { $max: list.nth($minmax, 2); } $length: list.length($columns); $childs: $length + 'n+' + $i; @if math.unit($min) != "" { @if $direction == 'row' { @if $rowGap > 0 { $min: calc(#{$min} - (#{$rowGap} / #{$length})); } } @if $direction == 'column' { @if $columnGap > 0 { $min: calc(#{$min} - (#{$columnGap} / #{$length})); } } } @if math.unit($max) != "" { @if $direction == 'row' { @if $rowGap > 0 { $max: calc(#{$max} - (#{$rowGap} / #{$length})); } } @if $direction == 'column' { @if $columnGap > 0 { $max: calc(#{$max} - (#{$columnGap} / #{$length})); } } } & > *:nth-child(#{$childs}) { @if $direction == 'row' and $min != 0 { min-width: $min; } @else if $min > 0 { min-height: $min; } @if $direction == 'row' and $max != 0 { max-width: $max; } @else if $max > 0 { max-height: $max; } } } } } } } }