// Миксин для media-breakpoint-up @mixin media-breakpoint-up($breakpoint, $breakpoints: $grid-breakpoints) { $min-width: map-get($breakpoints, $breakpoint); @if $min-width { @media (min-width: #{$min-width}) { @content; } } @else { @warn "Нет валидного брейкпоинта для '#{$breakpoint}'."; } } // Миксин для media-breakpoint-down @mixin media-breakpoint-down($breakpoint, $breakpoints: $grid-breakpoints) { $max-width: map-get($breakpoints, $breakpoint) - 0.02px; @if $max-width { @media (max-width: #{$max-width}) { @content; } } @else { @warn "Нет валидного брейкпоинта для '#{$breakpoint}'."; } } // Миксин для media-breakpoint-between @mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) { $min-width: map-get($breakpoints, $lower); $max-width: map-get($breakpoints, $upper) - 0.02px; @if $min-width and $max-width { @media (min-width: #{$min-width}) and (max-width: #{$max-width}) { @content; } } @else { @warn "Нет валидных брейкпоинтов для '#{$lower}' или '#{$upper}'."; } } // Миксин make-container @mixin make-container($max-widths: $container-max-widths, $gutter: $grid-gutter-width) { width: 100%; padding-right: $gutter; padding-left: $gutter; margin-right: auto; margin-left: auto; @each $breakpoint, $max-width in $max-widths { @include media-breakpoint-up($breakpoint, $grid-breakpoints) { max-width: #{$max-width}; } } } // Миксин make-row @mixin make-row($gutter: $grid-gutter-width) { --gutter-x: #{$gutter}; --gutter-y: 0; display: flex; flex-wrap: wrap; margin-top: calc(-1 * var(--gutter-y)); margin-right: calc(-0.5 * var(--gutter-x)); margin-left: calc(-0.5 * var(--gutter-x)); } // Миксин make-col-ready @mixin make-col-ready() { box-sizing: border-box; flex-shrink: 0; width: 100%; max-width: 100%; padding-right: calc(var(--gutter-x) * 0.5); padding-left: calc(var(--gutter-x) * 0.5); margin-top: var(--gutter-y); } // Миксин make-col @mixin make-col($size: false, $columns: $grid-columns) { @if $size { flex: 0 0 auto; width: calc(100% * #{calc($size / $columns)}); } @else { flex: 1 1 0; max-width: 100%; } } // Миксин make-col-auto @mixin make-col-auto() { flex: 0 0 auto; width: auto; } // Миксин make-col-offset @mixin make-col-offset($size, $columns: $grid-columns) { $num: calc($size / $columns); margin-left: if($num == 0, 0, calc(100% * #{$num})); } // Миксин row-cols @mixin row-cols($count) { > * { flex: 0 0 auto; width: 100% / $count; } } // Миксин make-grid-columns @mixin make-grid-columns($columns: $grid-columns, $breakpoints: $grid-breakpoints) { @each $breakpoint, $value in $breakpoints { $infix: if($breakpoint == 'xs', '', "-#{$breakpoint}"); @include media-breakpoint-up($breakpoint, $breakpoints) { @for $i from 1 through $columns { .col#{$infix}-#{$i} { @include make-col($i, $columns); } .offset#{$infix}-#{$i} { @include make-col-offset($i, $columns); } } } } } // Генерация классов контейнера и ряда .container, .container-fluid { @include make-container($container-max-widths, $grid-gutter-width); } .row { @include make-row; > * { @include make-col-ready; } } // Генерация классов столбцов и смещений @include make-grid-columns($grid-columns, $grid-breakpoints);