// container
@use 'sass:math';

@mixin make-container($gutter: $grid-gutter-width) {
    margin-left: auto;
    margin-right: auto;
    padding-left: ($gutter * 0.5);
    padding-right: ($gutter * 0.5);
    @include clearfix();
}

.gds-layout__container {
    @include make-container();
    max-width: 1200px;
}

.gds-layout__container--full-width {
    @include make-container();
    margin-left: 0;
    margin-right: 0;
    max-width: none;
}

// rows
@mixin make-row($gutter: $grid-gutter-width) {
    @include clearfix();
    margin-left: math.div($gutter, -2);
    margin-right: math.div($gutter, -2);
}

.gds-layout__row {
    @include make-row();
}

// columns
@mixin make-col($gutter: $grid-gutter-width) {
    position: relative;
    float: left;
    min-height: 1px;
    padding-left: ($gutter * 0.5);
    padding-right: ($gutter * 0.5);
}

@mixin make-col-span($size, $columns: $grid-columns) {
    width: percentage(math.div($size, $columns));
}

@mixin make-col-offset($size, $columns: $grid-columns) {
    margin-left: percentage(math.div($size, $columns));
}

@mixin make-col-push($size, $columns: $grid-columns) {
    left: if($size > 0, percentage(math.div($size, $columns)), auto);
}

@mixin make-col-pull($size, $columns: $grid-columns) {
    right: if($size > 0, percentage(math.div($size, $columns)), auto);
}

@mixin make-col-modifier($type, $size, $columns) {
    // Work around the lack of dynamic mixin @include support (https://github.com/sass/sass/issues/626)
    @if $type == push {
        @include make-col-push($size, $columns);
    } @else if $type == pull {
        @include make-col-pull($size, $columns);
    } @else if $type == offset {
        @include make-col-offset($size, $columns);
    }
}

@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
    $min: map-get($breakpoints, $name);
    @return if($min != 0, $min, null);
}

@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
    $next: breakpoint-next($name, $breakpoints);
    @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);
}

// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
@mixin media-breakpoint-up($name) {
    $min: breakpoint-min($name);

    @if $min {
        @media (min-width: $min) {
            @content;
        }
    } @else {
        @content;
    }
}

// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
// Makes the @content apply to the given breakpoint and narrower.
@mixin media-breakpoint-down($name) {
    $max: breakpoint-max($name);

    @if $max {
        @media (max-width: $max) {
            @content;
        }
    } @else {
        @content;
    }
}

@mixin make-grid-columns(
    $columns: $grid-columns,
    $gutter: $grid-gutter-width,
    $breakpoints: $grid-breakpoints
) {
    @each $breakpoint in map-keys($grid-breakpoints) {
        @for $i from 1 through $columns {
            .gds-layout__column--#{$breakpoint}-#{$i} {
                position: relative;
                min-height: 1px;
                padding-left: ($gutter * 0.5);
                padding-right: ($gutter * 0.5);
                color: inherit;
                border-color: inherit;
                border-bottom-color: inherit;
            }
        }

        @include media-breakpoint-up($breakpoint) {
            @for $i from 1 through $columns {
                .gds-layout__column--#{$breakpoint}-#{$i} {
                    float: left;
                    @include make-col-span($i, $columns);
                }
            }

            @each $modifier in (pull, push, offset) {
                @for $i from 0 through $columns {
                    .gds-layout__column--#{$breakpoint}-#{$modifier}-#{$i} {
                        @include make-col-modifier($modifier, $i, $columns);
                    }
                }
            }
        }
    }
}

@include make-grid-columns();

// Responsive utility classes
.gds-layout__hidden-xs-up {
    display: none !important;
}

@media (max-width: 543px) {
    .gds-layout__hidden-xs-down {
        display: none !important;
    }
}

@media (min-width: 544px) {
    .gds-layout__hidden-sm-up {
        display: none !important;
    }
}

@media (max-width: 767px) {
    .gds-layout__hidden-sm-down {
        display: none !important;
    }
}

@media (min-width: 768px) {
    .gds-layout__hidden-md-up {
        display: none !important;
    }
}

@media (max-width: 991px) {
    .gds-layout__hidden-md-down {
        display: none !important;
    }
}

@media (min-width: 992px) {
    .gds-layout__hidden-lg-up {
        display: none !important;
    }
}

@media (max-width: 1199px) {
    .gds-layout__hidden-lg-down {
        display: none !important;
    }
}

@media (min-width: 1200px) {
    .gds-layout__hidden-xl-up {
        display: none !important;
    }
}

.gds-layout__hidden-xl-down {
    display: none !important;
}
