/*
 * 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%;
    border-radius: 4.5px;
    mix-blend-mode: plus-lighter;
}

.slider > .custom-slider > .track {
    left: 0;
    width: 100%;
    background-color: rgba(255, 255, 255, 0.1);
}

.slider > .custom-slider > .primary {
    left: 0;
    background-color: rgba(255, 255, 255, 0.35);
}

.slider > .custom-slider > .secondary {
    background-color: rgba(255, 255, 255, 0.08);
}

.slider > .custom-slider > .knob {
    top: -2px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background-color: white;
    transform: translateX(-50%);
}

.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;
}
