/// Custom semantic column
///
/// @author [@esr360](http://twitter.com/esr360)
/// @access public
/// @group Kayzen-GS
/// @param {map} $custom - where custom config will be passed
/// @outputs custom column styles
@mixin column($custom: ()) {

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

    $config: map-merge((
        'width'        : 'full',
        'type'         : null,
        'stack'        : kgs-option('col-break'),
        'mobile-first' : kgs-setting('mobile-first'),
        'respond-to'   : null
    ), $custom);

    $config: $config !global;

    $span: null;
    $columns: null;

    //*************************************************************
    // Prepare Grid
    //*************************************************************

    // if 'width' is a fraction e.g. 'quarter'
    @if type-of(kgs-config('width')) == string {
        $span: nth(kgs-fraction(kgs-config(width)), 1);
        $columns: nth(kgs-fraction(kgs-config('width')), 2);
    }

    // if 'width' is a percentage e.g. 25%
    @else if type-of(kgs-config('width')) == number {
        $span: kgs-config(width);
        $columns: 100;
    }

    // if 'width' is a (span, columns) format e.g. (3, 12)
    @else if type-of(kgs-config('width')) == list {
        $span: nth(kgs-config('width'), 1);
        $columns: nth(kgs-config('width'), 2);
    }

    //*************************************************************
    // Apply Styles
    //*************************************************************

    @if kgs-config('mobile-first') {
        @media (min-width: kgs-config('stack')) {
            @include kgs-column-core;
        }
    } @else {
        @include kgs-column-core;
    }

    // if flow column
    @if kgs-config('type') == 'flow' {
        @include kgs-gutter(false);
        width: kgs-flow-width($span, $columns);
    }

    // if magic column
    @else if kgs-config('type') == 'magic' {
        @if kgs-config('mobile-first') {
            @media (min-width: kgs-config('stack')) {
                @include kgs-column-core;
                @include kgs-gutter;
                @include kgs-magic-column-core(&);
            }
        } @else {
            @include kgs-column-core;
            @include kgs-gutter;
            @include kgs-magic-column-core(&);
            @media (max-width: kgs-config('stack')) {
                @include kgs-stack-columns($type: 'magic', $core: true);
            }
        }
    }

    // if no-gutter column
    @else if kgs-config('type') == 'no-gutter' {
        @if kgs-config('mobile-first') {
            @media (min-width: kgs-config('stack')) {
                width: kgs-no-gutter-width($span, $columns);
            }
        } @else {
            width: kgs-no-gutter-width($span, $columns);

            @media (max-width: kgs-config('stack')) {
                @include kgs-stack-columns($core: true);
            }
        }
    }

    // all other column types
    @else {
        @if kgs-config('mobile-first') {
            width: 100%;

            @media (min-width: kgs-config('stack')) {
                @include kgs-gutter;
                width: kgs-default-width($span, $columns);
                @if kgs-config('type') == 'block' {
                    display: table-cell;
                }
            }
        } @else {
            @include kgs-gutter;
            width: kgs-default-width($span, $columns);

            @if kgs-config('type') == 'block' {
                display: table-cell;
            }

            @media (max-width: kgs-config('stack')) {
                @include kgs-stack-columns($core: true);
            }
        }
    }

    //*************************************************************
    // Adaptive Widths
    //*************************************************************

    @if kgs-config('respond-to') {

        $breakpoints: if(
            kgs-config('mobile-first'),
            list-reverse(kgs-config('respond-to')),
            kgs-config('respond-to')
        );

        @each $breakpoint, $width in $breakpoints {

            $columns: null;
            $span: null;

            $respond-scale: if(kgs-config('mobile-first'), 'min', 'max');

            @media (#{$respond-scale}-width: kgs-breakpoint($breakpoint)) {

                // if 'width' is a fraction e.g. 'quarter'
                @if type-of($width) == string {
                    $span: nth(kgs-fraction($width), 1);
                    $columns: nth(kgs-fraction($width), 2);
                }

                // if 'width' is a percentage e.g. 25%
                @else if type-of($width) == number {
                    $span: $width;
                    $columns: 100;
                }

                // if 'width' is in (span, columns) format e.g. (3, 12)
                @else if type-of($width) == list {
                    $span: nth($width, 1);
                    $columns: nth($width, 2);
                }

                @include kgs-column-core;

                // if flow column
                @if kgs-config('type') == 'flow' {
                    width: kgs-flow-width($span, $columns);
                }

                // all other column types
                @else {
                    width: kgs-default-width($span, $columns);
                }

            }

        }

    }

} // @mixin column