// /**
//  * Copyright © Magento, Inc. All rights reserved.
//  * See COPYING.txt for license details.
//  */

//
//  Utilities
//  _____________________________________________

//
//  Convert values to unit specified in typography variables
//  ---------------------------------------------

.lib-font-size-value(
    @_value
) when not (@_value = false) and not (@_value = '') and (@font-size-unit-convert) {
    @fontValue: unit(((@_value) * 1), @font-size-unit) / @font-size-unit-ratio;
}
.lib-font-size-value(
    @_value
) when (@font-size-unit-convert = false) {
    @fontValue: @_value;
}

.lib-visibility-hidden() {
    height: 0;
    visibility: hidden;
}

.lib-visually-hidden() {
    border: 0;
    clip: rect(0, 0, 0, 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
}

.lib-visually-hidden-reset() {
    clip: auto;
    height: auto;
    margin: 0;
    overflow: visible;
    position: static;
    width: auto;
}

//
//  Clearfix
//  ---------------------------------------------

.lib-clearfix() {
    &:before,
    &:after {
        content: '';
        display: table;
    }

    &:after {
        clear: both;
    }
}

.lib-clearer() {
    &:after {
        clear: both;
        content: '';
        display: table;
    }
}

//
//  Gradient
//  ---------------------------------------------

#lib-gradient {
    //  Horizontal gradient, from left to right
    //  Creates two color stops, start and end, by specifying a color and position for each color stop.
    //  Color stops are not available in IE9 and below.
    //  Filters are enabled
    .horizontal(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when not (@disable-filters) and (@_background-color-position = true) {
        background-color: @_end-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(left, color-stop(@_start-color @_start-percent), color-stop(@_end-color @_end-percent)); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to right, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", @_start-color, @_end-color)); // IE9 and down
    }

    .horizontal(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when not (@disable-filters) and (@_background-color-position = false) {
        background-color: @_start-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(left, color-stop(@_start-color @_start-percent), color-stop(@_end-color @_end-percent)); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to right, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", @_start-color, @_end-color)); // IE9 and down
    }

    //  Horizontal gradient, from left to right
    //  Creates two color stops, start and end, by specifying a color and position for each color stop.
    //  Color stops are not available in IE9 and below.
    //  Filters are disabled
    .horizontal(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when (@disable-filters) and (@_background-color-position = true) {
        background-color: @_end-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(left, color-stop(@_start-color @_start-percent), color-stop(@_end-color @_end-percent)); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to right, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    }

    .horizontal(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when (@disable-filters) and (@_background-color-position = false) {
        background-color: @_start-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(left, color-stop(@_start-color @_start-percent), color-stop(@_end-color @_end-percent)); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to right, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    }

    //  Vertical gradient, from top to bottom
    //  Creates two color stops, start and end, by specifying a color and position for each color stop.
    //  Color stops are not available in IE9 and below.
    //  Filters are enabled
    .vertical(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when not (@disable-filters) and (@_background-color-position = true) {
        background-color: @_end-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(top, @_start-color @_start-percent, @_end-color @_end-percent); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to bottom, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", @_start-color, @_end-color)); // IE9 and down
    }

    .vertical(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when not (@disable-filters) and (@_background-color-position = false) {
        background-color: @_start-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(top, @_start-color @_start-percent, @_end-color @_end-percent); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to bottom, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
        filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", @_start-color, @_end-color)); // IE9 and down
    }

    //  Vertical gradient, from top to bottom
    //  Creates two color stops, start and end, by specifying a color and position for each color stop.
    //  Color stops are not available in IE9 and below.
    //  Filters are disabled
    .vertical(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when (@disable-filters) and (@_background-color-position = true) {
        background-color: @_end-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(top, @_start-color @_start-percent, @_end-color @_end-percent); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to bottom, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    }

    .vertical(
        @_start-color,
        @_end-color,
        @_start-percent: 0%,
        @_end-percent: 100%,
        @_background-color-position: true
    ) when (@disable-filters) and (@_background-color-position = false) {
        background-color: @_start-color;
        background-repeat: repeat-x;
        background-image: -webkit-linear-gradient(top, @_start-color @_start-percent, @_end-color @_end-percent); // Safari 5.1-6, Chrome 10+
        background-image: linear-gradient(to bottom, @_start-color @_start-percent, @_end-color @_end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
    }
}

//
//  Custom background gradient
//  ---------------------------------------------

//  Pager gradient - horizontal
.lib-background-gradient(
    @_background-gradient-color-start,
    @_background-gradient-color-end,
    @_background-gradient-direction,
    @_background-gradient,
    @_background-gradient-color-position: true
) when (@_background-gradient-direction = horizontal) and (@_background-gradient = true) {
    #lib-gradient > .horizontal(
    @_start-color: @_background-gradient-color-start,
    @_end-color: @_background-gradient-color-end,
    @_background-color-position: @_background-gradient-color-position
    );
}

//  Pager gradient - vertical
.lib-background-gradient(
    @_background-gradient-color-start,
    @_background-gradient-color-end,
    @_background-gradient-direction,
    @_background-gradient,
    @_background-gradient-color-position: true
) when (@_background-gradient-direction = vertical) and (@_background-gradient = true) {
    #lib-gradient > .vertical(
    @_start-color: @_background-gradient-color-start,
    @_end-color: @_background-gradient-color-end,
    @_background-color-position: @_background-gradient-color-position
    );
}

//
//  Rotate
//  ---------------------------------------------

.lib-rotate(@_rotation) {
    -webkit-transform: rotate(@_rotation); //  Use in 8 Safari
        -ms-transform: rotate(@_rotation); //  Use in 9 IE
            transform: rotate(@_rotation);
}

//
//  Remove spaces between elements with display: inline-block
//  ---------------------------------------------

.lib-inline-block-space-container() {
    font-size: 0;
    letter-spacing: -1px;
    line-height: 0;
}

.lib-inline-block-space-item(
    @_font-size: @font-size__base,
    @_line-height: normal
) {
    .lib-font-size(@_font-size);
    font-size: @_font-size;
    letter-spacing: normal;
    line-height: @_line-height;
}

//
//  Add any css property
//  ---------------------------------------------

.lib-css(
    @_property,
    @_value,
    @_prefix: 0
) when (@_prefix = 1)
  and not (@_value = '')
  and not (@_value = false)
  and not (extract(@_value, 1) = false)
  and not (extract(@_value, 2) = false)
  and not (extract(@_value, 3) = false)
  and not (extract(@_value, 4) = false)
  and not (extract(@_value, 5) = false) {
  -webkit-@{_property}: @_value;
       -moz-@{_property}: @_value;
        -ms-@{_property}: @_value;
}

.lib-css(
    @_property,
    @_value,
    @_prefix: 0
) when not (@_value = '')
  and not (@_value = false)
  and not (extract(@_value, 1) = false)
  and not (extract(@_value, 2) = false)
  and not (extract(@_value, 3) = false)
  and not (extract(@_value, 4) = false)
  and not (extract(@_value, 5) = false) {
    @{_property}: @_value;
}

//
//  Add url to property
//  ---------------------------------------------

// usage:
// .column.left {
//     .lib-url('images/fallback.png');
//     background:url("@{url}") repeat-y;
// }
// .columns {
//     .lib-url('images/fallback.png', 'Magento_Catalog');
//     background:url("@{url}") repeat;
// }

@urls-resolved: false;

.lib-url(@_path) {
    @url: "@{baseDir}@{_path}";
}

.lib-url(
    @_path,
    @_module
) when not (@_module = false) and not (@_module = '') and (@urls-resolved = false) {
    @url: "@{_module}::@{_path}";
}

.lib-url(
    @_path,
    @_module
) when not (@_module = false) and not (@_module = '') and (@urls-resolved = true) {
    @url: "@{baseDir}@{_module}/@{_path}";
}

//
//  Url existing check
//  ---------------------------------------------

.lib-url-check(@_path) {
    @lib-url-check-output: @_path;
}

.lib-url-check(@_path) when not (@_path = false) {
    @lib-url-check-output: url(@_path);
}

//
//  Arrow
//  ---------------------------------------------

.lib-arrow(
    @_position,
    @_size,
    @_color
) {
    border: @_size solid transparent;
    height: 0;
    width: 0;
    ._lib-abbor_el(@_position, @_color);
}

._lib-abbor_el(
    @_position,
    @_color
) when (@_position = left) {
    .lib-css(border-right-color, @_color);
}

._lib-abbor_el(
    @_position,
    @_color
) when (@_position = right) {
    .lib-css(border-left-color, @_color);
}

._lib-abbor_el(
    @_position,
    @_color
) when (@_position = up) {
    .lib-css(border-bottom-color, @_color);
}

._lib-abbor_el(
    @_position,
    @_color
) when (@_position = down) {
    .lib-css(border-top-color, @_color);
}

//
//  Input placeholder
//  ---------------------------------------------

.lib-input-placeholder(
    @_input-placeholder-color: @form-element-input-placeholder__color,
    @_input-placeholder-font-weight: @form-element-input__font-weight
) {
    &::-webkit-input-placeholder {
        .lib-css(color, @_input-placeholder-color);
        .lib-css(font-weight, @_input-placeholder-font-weight);
    }

    &:-moz-placeholder {
        .lib-css(color, @_input-placeholder-color);
        .lib-css(font-weight, @_input-placeholder-font-weight);
    }

    &::-moz-placeholder {
        .lib-css(color, @_input-placeholder-color);
        .lib-css(font-weight, @_input-placeholder-font-weight);
    }

    &:-ms-input-placeholder {
        .lib-css(color, @_input-placeholder-color);
        .lib-css(font-weight, @_input-placeholder-font-weight);
    }
}

//
//  Flex layout
//  ---------------------------------------------

.lib-vendor-prefix-display(
    @_value: flex
) {
    display: ~"-webkit-@{_value}";
    display: ~"-ms-@{_value}box";
    display: @_value;
}

.lib-vendor-prefix-flex-grow(
    @_value: 0
) {
    -webkit-flex-grow: @_value;
            flex-grow: @_value;
}

.lib-vendor-prefix-flex-shrink (
    @_value: 1
) {
    -webkit-flex-shrink: @_value;
            flex-shrink: @_value;
}

.lib-vendor-prefix-flex-basis (
    @_value: auto
) {
    -webkit-flex-basis: @_value;
            flex-basis: @_value;
}

.lib-vendor-prefix-flex-wrap (
    @_value: wrap
) {
    -webkit-flex-wrap: @_value;
            flex-wrap: @_value;
}

.lib-vendor-prefix-flex-direction (
    @_value: column
) {
    -webkit-flex-direction: @_value;
        -ms-flex-direction: @_value;
            flex-direction: @_value;
}

.lib-vendor-prefix-order (
    @_value: 0
) {
    -ms-flex-order: @_value;
     -webkit-order: @_value;
             order: @_value;
}

.lib-vendor-box-align (
    @_value: stretch
) {
    -webkit-align-items: @_value;
        -ms-align-items: @_value;
            align-items: @_value;
}

.lib-vendor-prefix-appearance (
    @value: none
) {
    -webkit-appearance: @value;
    -moz-appearance: @value;
    appearance: @value;
}

.lib-vendor-prefix-column-count (
    @_value
) {
    -webkit-column-count: @_value;
       -moz-column-count: @_value;
            column-count: @_value;
}

//
//  Pointer for popups or dropdowns
//  ---------------------------------------------

.lib-pointer(
    @_size: 6px,
    @_background-color: @color-white,
    @_border-color: @color-gray-light3,
    @_position__vertical: top,
    @_position__horizontal: left,
    @_position__vertical__value: -12px,
    @_position__horizontal__value: @indent__s,
    @_z-index: 99
) {
    &:before,
    &:after {
        content: '';
        position: absolute;
        display: block;
        width: 0;
        height: 0;
        border-bottom-style: solid;
    }

    &:before {
        .lib-css(@_position__horizontal, @_position__horizontal__value);
        .lib-css(@_position__vertical, @_position__vertical__value);
        .lib-css(border, solid @_size - 1);
        .lib-css(border-color, transparent transparent @_background-color transparent);
        .lib-css(z-index, @_z-index);
    }

    &:after {
        .lib-css(@_position__horizontal, @_position__horizontal__value - 1);
        .lib-css(@_position__vertical, @_position__vertical__value - 2);
        .lib-css(border, solid @_size);
        .lib-css(border-color, transparent transparent @_border-color transparent);
        .lib-css(z-index, @_z-index - 1);
    }
}
