/// Kayzen-GS core
///
/// @author [@esr360](http://twitter.com/esr360)
/// @access public
/// @group Kayzen-GS
/// @param {map} $custom - where custom config will be passed
/// @outputs all grid system styles
///
/// @example
///     @include kayzen-gs((
///         'options':(
///             'max-width' : 90%
///         ),
///         'breakpoints':(
///             'break-3'   : 840px,
///             'break-5'   : 1600px
///         )
///     ));
@mixin kayzen-gs($custom: ()) {

    //*************************************************************
    // Configuration
    //*************************************************************

    $kayzenGS: map-merge-deep($kayzenGS, $custom) !global;

    //*************************************************************
    // Reset Spacing
    //*************************************************************

    * {
        letter-spacing: normal;
        text-rendering: auto;
        word-spacing: normal;
    }

    //*************************************************************
    // Row
    //*************************************************************

    .#{kgs-option('row-namespace')},
    [class*="#{kgs-option('row-namespace')}-"] {
        @include kgs-row-core;
    }

    //*************************************************************
    // Columns
    //*************************************************************

    .#{kgs-option('row-namespace')} {

        // Default Columns
        //*********************************************************

        @at-root {
            @if kgs-setting('mobile-first') {
                @media (min-width: kgs-option('col-break')) {
                    @include kgs-default-columns;
                }
            } @else {
                @include kgs-default-columns;
            }
        }

        @if (kgs-setting('mobile-first'), '&:not([class*="stack-"])', '&') {
            @if not kgs-setting('mobile-first') {
                @if kgs-setting('responsive') {
                    &:not([class*="stack-"]) {
                        @media (max-width: kgs-option('col-break')) {
                            @include kgs-stack-columns;
                        }
                    }
                }
            }
        }

        @if kgs-setting('responsive') {
            @each $bp, $width in kayzenGS('breakpoints') {
                &.stack-#{$bp} {
                    @if kgs-setting('mobile-first') {
                        @media (#{$kgs-scale}-width: $width) {
                            @include kgs-default-columns;
                        }
                    } @else {
                        @media (#{$kgs-scale}-width: $width) {
                            @include kgs-stack-columns;
                        }
                    }
                }
            }
        }

        // Flow Columns
        //*********************************************************

        @if kgs-setting('flow-columns') {

            &-flow {

                @include kgs-pull('flow');
                @include kgs-push('flow');

                &:not(.#{kgs-option('row-namespace')}-no-gutter) {
                    margin-left: -#{kgs-option('gutter')};
                    width: 100% + kgs-option('gutter');
                }

                @if (kgs-setting('mobile-first'), '&:not([class*="stack-"])', '&') {
                    @if kgs-setting('mobile-first') {
                        @media (min-width: kgs-option(col-break)) {
                            @include kgs-flow-columns;
                        }
                    } @else {

                        @include kgs-flow-columns;
                        > [class*="#{kgs-option(col-namespace)}"] {
                            margin-left: #{kgs-option(gutter)};
                        }

                        @if kgs-setting('responsive') {
                            &:not([class*="stack-"]) {
                                @media (max-width: kgs-option('col-break')) {
                                    @include kgs-stack-columns($type: 'flow');
                                }
                            }
                        }

                    }
                }

                @if kgs-setting('responsive') {
                    @each $bp, $width in kayzenGS('breakpoints') {
                        &.stack-#{$bp} {
                            @if kgs-setting('mobile-first') {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-flow-columns;
                                }
                            } @else {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-stack-columns($type: 'flow');
                                }
                            }
                        }
                    }
                }

                // Adaptive Columns
                @if kgs-setting('responsive') {
                    @if kgs-setting('adaptive-columns') {
                        @include kgs-adaptive-columns;
                    }
                }

            } // &--flow

        } // kgs-setting()

        // Magic Columns
        //*********************************************************

        @if kgs-setting('magic-columns') {

            &-magic {

                @if (kgs-setting('mobile-first'), '&:not([class*="stack-"])', '&') {

                    @if kgs-setting('mobile-first') {
                        @media (min-width: kgs-option('col-break')) {
                            @include kgs-magic-columns;
                        }
                    } @else {
                        @include kgs-magic-columns;
                        @if kgs-setting('responsive') {
                            &:not([class*="stack-"]) {
                                @media (max-width: kgs-option('col-break')) {
                                    @include kgs-stack-columns($type: 'magic');
                                }
                            }
                        }
                    }

                    @if kgs-setting('responsive') {
                        @each $bp, $width in kayzenGS('breakpoints') {
                            &.stack-#{$bp} {
                                @if kgs-setting('mobile-first') {
                                    @media (#{$kgs-scale}-width: $width) {
                                        @include kgs-magic-columns;
                                    }
                                } @else {
                                    @media (#{$kgs-scale}-width: $width) {
                                        @include kgs-stack-columns($type: 'magic');
                                    }
                                }
                            }
                        }
                    }

                }

            } // &--magic

        } // kgs-setting()

        // No Gutter Columns
        //*********************************************************

        @if kgs-setting('no-gutter-columns') {

            &-no-gutter, &-block {

                @include kgs-pull('no-gutter');
                @include kgs-push('no-gutter');

                @if (kgs-setting('mobile-first'), '&:not([class*="stack-"])', '&') {
                    @if kgs-setting('mobile-first') {
                        @media (min-width: kgs-option('col-break')) {
                            @include kgs-no-gutter-columns;
                        }
                    } @else {
                        @include kgs-no-gutter-columns;
                        @if kgs-setting('responsive') {
                            &:not([class*="stack-"]) {
                                @media (max-width: kgs-option('col-break')) {
                                    @include kgs-stack-columns;
                                }
                            }
                        }
                    }
                }

                @if kgs-setting('responsive') {
                    @each $bp, $width in kayzenGS('breakpoints') {
                        &.stack-#{$bp} {
                            @if kgs-setting('mobile-first') {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-no-gutter-columns;
                                }
                            } @else {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-stack-columns;
                                }
                            }
                        }
                    }
                }

            }

            &-no-gutter {

                // Adaptive Columns
                @if kgs-setting('responsive') {
                    @if kgs-setting('adaptive-columns') {
                        @include kgs-adaptive-columns($col-type: 'no-gutter');
                    }
                }

            }

        } // kgs-setting()

        // Block Columns
        //*********************************************************

        @if kgs-setting('block-columns') {

            &-block {

                @if (kgs-setting('mobile-first'), '&:not([class*="stack-"])', '&') {
                    @if kgs-setting('mobile-first') {
                        @media (min-width: kgs-option('col-break')) {
                            @include kgs-block-columns;
                        }
                    } @else {
                        @include kgs-block-columns;
                        @if kgs-setting('responsive') {
                            &:not([class*="stack-"]) {
                                @media (max-width: kgs-option('col-break')) {
                                    @include kgs-stack-columns;
                                }
                            }
                        }
                    }
                }

                @if kgs-setting('responsive') {
                    @each $bp, $width in kayzenGS('breakpoints') {
                        &.stack-#{$bp} {
                            @if kgs-setting('mobile-first') {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-block-columns;
                                }
                            } @else {
                                @media (#{$kgs-scale}-width: $width) {
                                    @include kgs-stack-columns;
                                }
                            }
                        }
                    }
                }

            } // &-block

        } // kgs-setting()

        // Reverse Column Order
        //*********************************************************

        @if kgs-setting('reverse-columns') {

            &-reverse {
                &:not([class*="reverse-break"]) {
                    @include kgs-reverse-order;
                }
            }

            @if kgs-setting('responsive') {
                @each $bp, $width in kayzenGS('breakpoints') {
                    @media (#{$kgs-scale}-width: $width) {
                        &.reverse-#{$bp} {
                            @include kgs-reverse-order;
                        }
                    }
                }
            }

        } // kgs-setting()

    } // row

    //*************************************************************
    // Custom Push/Pull
    //*************************************************************

    @if kgs-setting('pull-columns') {
        @include kgs-pull;
    }

    @if kgs-setting('push-columns') {
        @include kgs-push;
    }

} // @mixin kayzen-gs