/*
 * Copyright (C) 2016 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

.slider {
    position: relative;
}

.slider > .custom-slider,
.slider > input {
    position: absolute;
    left: 0;
    width: 100%;
}

.slider > .custom-slider {
    pointer-events: none;
    top: 5.5px;
    height: 5px;
}

.slider > .custom-slider > * {
    position: absolute;
}

.slider > .custom-slider > .fill {
    top: 0;
    height: 100%;
    mix-blend-mode: plus-lighter;
}

.slider > .custom-slider > .fill.primary {
    left: 0;
    background-color: rgba(255, 255, 255, 0.45);
    border-top-left-radius: 4.5px;
    border-bottom-left-radius: 4.5px;
}

.slider > .custom-slider > .fill.track {
    right: 0;
    background-color: rgba(255, 255, 255, 0.1);
    border-top-right-radius: 4.5px;
    border-bottom-right-radius: 4.5px;
}

.slider > .custom-slider > .fill.secondary {
    background-color: rgba(255, 255, 255, 0.08);
    border-top-right-radius: 4.5px;
    border-bottom-right-radius: 4.5px;
}

.slider > .custom-slider > .knob {
    background-color: white;
    transform: translateX(-50%);
}

.slider > .custom-slider > .knob.circle {
    top: -2px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
}

.slider > .custom-slider > .knob.bar {
    top: -6px;
    width: 4px;
    height: 17px;
    border-radius: 4px;
}

.slider > .custom-slider > .knob.none {
    top: -2px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background-color: transparent;
}

.slider > input {
    top: 0;
    margin: 0;
    height: 100%;
    background-color: transparent;
    -webkit-appearance: none !important;
    /* Disabling this for now because the outline is visualy inconsistent with the button 
       focus state. Tracking at https://bugs.webkit.org/show_bug.cgi?id=174906 */
    outline: none;
}


.ios .slider > input {
    /* On iOS only, we want to only capture events on the thumb and not the track. */
    pointer-events: none;

    /* Make sure we don't show any UI as we drag the scrubber on iOS. */
    -webkit-user-select: none !important;
    -webkit-touch-callout: none !important;
    -webkit-tap-highlight-color: transparent;
}

.slider > input::-webkit-slider-thumb {
    width: 9px;
    height: 100%;
    border: none;
    box-shadow: none;
    background-color: transparent;
    -webkit-appearance: none !important;
    pointer-events: all;
}

/* When disabled, we only want to show the track and turn off interaction. */

.slider.disabled > input,
.slider.disabled > .custom-slider > .primary,
.slider.disabled > .custom-slider > .secondary,
.slider.disabled > .custom-slider > .knob {
    display: none;
}

/* Increase the touch region for the thumb on iOS */

.ios .slider > input {
    /* We need to extend the slider to ensure the padded thumb is
       tracking along the same width as the custom slider rendering. */
    width: calc(100% + 16px);
    height: calc(100% + 10px);
    transform: translate(-8px, -5px);
}

.ios .slider > input::-webkit-slider-runnable-track {
    /* We need to force the height to be 100% as on some pages the height would
       be 0 otherwise, see <rdar://problem/31769830>. */
    height: 100%;
}

.ios .slider > input::-webkit-slider-thumb {
    padding: 0 8px;
    box-sizing: content-box;
}
