// Colors based on Chromium engine // (every browser renders its input range on its own, here we are trying // to add some consistency) $range-bg-color: $gray-175; $range-border-color: $gray-400; $range-bg-progress-color: $secondary; $range-height: 8px; $range-radius: 3px; $knob-size: 14px; .range-control { display: inline-flex; flex-direction: column; vertical-align: top; &__label { font-size: 14px; color: $gray-700; margin-bottom: space-x(0.5); } // enhance hover area of ".range-slider" placeholder // (cf ".range-slider") &:hover .range-slider .range-slider__placeholder { display: block; } } /////////////////////////////////////////////// .range-slider { $self: &; $placeholder-offset-y: -32px; position: relative; width: 100%; height: $range-height; &__scale { position: absolute; width: inherit; height: inherit; background-color: $range-bg-color; border: 1px solid $range-border-color; border-radius: $range-radius; } &__scale-sel { position: absolute; background-color: $range-bg-progress-color; width: inherit; height: inherit; border-radius: $range-radius; border: 1px solid $range-border-color; } &__knob { @include unselectable; @include clickable; z-index: 1; background-color: $range-bg-progress-color; width: $knob-size; height: $knob-size; border-radius: 50%; position: absolute; box-shadow: 0 0 1px 0 $range-bg-progress-color; // alignement with the bar transform: translateX(-5px) translateY(-3px); &.disabled { cursor: not-allowed; } &:hover { background-color: darken($range-bg-progress-color, 15%); } } &__placeholder { display: none; background-color: $black; color: $white; position: absolute; padding: space-x(0.5) space-x(1); text-align: center; font-size: 14px; font-weight: bold; border-radius: 5px; box-shadow: 0 0 1px 0 $black; opacity: 0.8; transform: translateX(-25%) translateY($placeholder-offset-y); } &:hover & { &__placeholder { display: block; } } } //////////////////////////////////////////// .range-simple { display: inline-flex; flex-direction: column; vertical-align: top; position: relative; &__label { font-size: 14px; color: $gray-700; } &__field { position: relative; } & input[disabled] { cursor: not-allowed; } } //////////////////////////////////////////// // Cross browser rules // // (?) Range consistency issue between browsers UI engine: mostly rely on // Chromium UI and adapt it to other engine // // Some examples: // @link https://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html input[type=range] { @include clickable; width: 100%; } // Styling FireFox input range, mimicking Chromium one // // (?) * unable to differenciate selector betwenn background range and progress // one → set only background range // * unable to position the input ideally → have to rely on // absolute + position input[type=range] { -webkit-appearance: none; } input[type=range]::-webkit-slider-runnable-track { $chromium-offset-y: 4px; height: $range-height; border-radius: $range-radius; border: 1px solid $range-border-color; background: $range-bg-color; width: 100%; position: absolute; top: $chromium-offset-y; } input[type=range]::-webkit-slider-thumb { $chromium-offset-y: -4px; -webkit-appearance: none; transform: translateY($chromium-offset-y); border: none; height: $knob-size; width: $knob-size; border-radius: 50%; background-color: $range-bg-progress-color; box-shadow: 0 0 1px 0 $range-bg-progress-color; } // Styling FireFox input range, mimicking Chromium one // // (?) * unable to differenciate selector betwenn background range and progress // one → set only background range // * unable to position the input ideally → have to rely on // translation input[type=range]::-moz-range-track { $firefox-height: #{$range-height - 2px}; $firefox-offset-y: -2px; height: $firefox-height; border-radius: $range-radius; border: 1px solid $range-border-color; background: $range-bg-color; transform: translateY($firefox-offset-y); } input[type=range]::-moz-range-thumb { $firefox-offset-y: -2px; border: none; height: $knob-size; width: $knob-size; border-radius: 50%; background-color: $range-bg-progress-color; box-shadow: 0 0 2px 0 $range-bg-progress-color; transform: translateY($firefox-offset-y); } // hide the outline behind the border input[type=range]:-moz-focusring { outline: 1px solid white; outline-offset: -1px; }