// Mixins
// ===
//
// Background Shimmer
// ---

@mixin background-shimmer() {
    overflow: hidden;
    background: $neutral-10;
    background-image: linear-gradient(to right,
        $neutral-10 0%, scale-color($neutral-15, $lightness: -5%) 50%, $neutral-10 100%);
    background-repeat: no-repeat;
    background-size: 100vw 100vh;
    animation: 1.5s linear infinite background-shimmer;
}


// Visually Hidden
// ---

@mixin visually-hidden() {
    position: absolute;

    overflow: hidden;
    clip: rect(1px, 1px, 1px, 1px);
    width: 1px;
    height: 1px;
    padding: 0;
    border: 0;
}


// Wrap At Root
// ---
//
// Wraps the nested blocks in the `$selector` of your choice, and at the root
// level. Specificity of the selector can be increased by increasing the
// `$degree` to a higher number than the default `1`.

// Examples:
// ---
//
// Default:
//
// @include wrap-at-root("#app") {
//     .u-border-red { border: 1px solid red; }
// }
//
// Output: #app .u-border-red { border: 1px solid red; }
//
//
// Custom:
//
// @include wrap-at-root("#app", 3) {
//     .u-border-red { border: 1px solid red; }
// }
//
// Output: #app#app#app .u-border-red { border: 1px solid red; }


// Parameters
// ---
//
// @param $selector [String]: ID selector.
// @param $degree [Number]: Effectively the number of id-level selectors you
// need to override.

@mixin wrap-at-root($selector, $degree: 1) {
    $selector-chain: '';

    // Build an id selector by chaining the same id onto itself once more than
    // the specified degree. So if degree: 3, we get #id#id#id.

    @for $i from 1 through $degree {
        $selector-chain: $selector-chain + $selector;
    }

    @at-root #{$selector-chain} {
        @content;
    }
}
