/**
 * Animation mixin.
 */
@mixin animation($animate...) {
    $max: length($animate);
    $animations: '';

    @for $i from 1 through $max {
        $animations: #{$animations + nth($animate, $i)};

        @if $i < $max {
            $animations: #{$animations + ", "};
        }
    }
    -webkit-animation: $animations;
    -moz-animation:    $animations;
    -o-animation:      $animations;
    animation:         $animations;
}

@mixin flex() {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
}

/**
 * Keyframes mixin.
 */
@mixin keyframes($animationName) {
    @-webkit-keyframes #{$animationName} {
        @content;
    }
    @-moz-keyframes #{$animationName} {
        @content;
    }
    @-o-keyframes #{$animationName} {
        @content;
    }
    @keyframes #{$animationName} {
        @content;
    }
}

@mixin circle($diameter) {
    width: $diameter;
    height: $diameter;
    border-radius: 50%;
}

/**
* Absolute position the element at the top left corner
**/
@mixin topLeft() {
    position: absolute;
    top: 0;
    left: 0;
}

@mixin absoluteAligning() {
    top: 50%;
    left: 50%;
    position: absolute;
    @include transform(translate(-50%, -50%));
}

/**
* Defines the maximum width and height
**/
@mixin maxSize($value) {
    max-width: $value;
    max-height: $value;
}

@mixin transform($func) {
    -moz-transform: $func;
    -ms-transform: $func;
    -webkit-transform: $func;
    -o-transform: $func;
    transform: $func;
}

@mixin transition($transition...) {
    -moz-transition:    $transition;
    -o-transition:      $transition;
    -webkit-transition: $transition;
    transition:         $transition;
}

/**
 * Mixin styling a placeholder.
 **/
@mixin placeholder() {
    $selectors: (
        "::-webkit-input-placeholder",
        "::-moz-placeholder",
        ":-moz-placeholder",
        ":-ms-input-placeholder"
    );

    @each $selector in $selectors {
        #{$selector} {
            @content;
        }
    }
}

/**
 * Mixin styling a slider track for different browsers.
 **/
@mixin slider() {
    $selectors: (
        "input[type=range]::-webkit-slider-runnable-track",
        "input[type=range]::-moz-range-track",
        "input[type=range]::-ms-track"
    );

    @each $selector in $selectors {
        #{$selector} {
            @content;
        }
  }
}

/**
 * Mixin styling a slider thumb for different browsers.
 **/
@mixin slider-thumb() {
    $selectors: (
        "input[type=range]::-webkit-slider-thumb",
        "input[type=range]::-moz-range-thumb",
        "input[type=range]::-ms-thumb"
    );

    @each $selector in $selectors {
        #{$selector} {
            @content;
        }
    }
}

@mixin box-shadow($h, $y, $blur, $color, $inset: false) {
    @if $inset {
        -webkit-box-shadow: inset $h $y $blur $color;
        -moz-box-shadow: inset $h $y $blur $color;
        box-shadow: inset $h $y $blur $color;
    } @else {
        -webkit-box-shadow: $h $y $blur $color;
        -moz-box-shadow: $h $y $blur $color;
        box-shadow: $h $y $blur $color;
    }
}

@mixin no-box-shadow {
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
}

@mixin box-sizing($box-model) {
    -webkit-box-sizing: $box-model; // Safari <= 5
    -moz-box-sizing: $box-model; // Firefox <= 19
    box-sizing: $box-model;
}

@mixin border-radius($radius) {
    -webkit-border-radius: $radius;
    border-radius: $radius;
    /* stops bg color from leaking outside the border: */
    background-clip: padding-box;
}

@mixin opacity($opacity) {
    opacity: $opacity;
    $opacity-ie: $opacity * 100;
    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=$opacity-ie);
    filter: alpha(opacity=$opacity-ie); //IE8
}

@mixin text-truncate {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/**
 * Creates a semi-transparent background with the given color and alpha
 * (opacity) value.
 */
@mixin transparentBg($color, $alpha) {
    background-color: rgba(red($color), green($color), blue($color), $alpha);
}

/**
 * Change the direction of the current element to LTR, but do not change the direction
 * of its children; Keep them RTL.
 */
@mixin ltr {
    body[dir=rtl] & {
        direction: ltr;

        & > * {
            direction: rtl;
        }
    }
}
