|
$ticks-height: 5px;
|
|
$ticks-thickness: 1px;
|
|
$max-ticks-allowed: 30;
|
|
$thumb-size: 20px;
|
|
$track-height: #{calc($thumb-size / 2)};
|
|
|
|
.slider {
|
|
|
|
--ticks-count: calc(var(--max) - var(--min)) / var(--step);
|
|
--too-many-ticks: min(1, Max(var(--ticks-count) - #{$max-ticks-allowed}, 0));
|
|
--x-step: max(var(--step), var(--too-many-ticks) * (var(--max) - var(--min)));
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
background: linear-gradient(to right, var(--text-muted-color) $ticks-thickness, transparent 1px) repeat-x;
|
|
background-size: calc((100% - #{$thumb-size}) / ((var(--max) - var(--min)) / var(--x-step))) #{$ticks-height};
|
|
background-position-x: #{calc($track-height - $ticks-thickness / 2)};
|
|
background-position-y: bottom;
|
|
|
|
font-weight: 700;
|
|
color: var(--text-muted-color);
|
|
font-size: 0.8125rem;
|
|
height: 22px;
|
|
margin-top: 2.5ch;
|
|
margin-bottom: 2.5ch;
|
|
|
|
|
|
&::before,
|
|
&::after {
|
|
content: counter(x);
|
|
position: absolute;
|
|
bottom: calc(-2.5ch - 2px);
|
|
top: calc(2.5ch + 2px);
|
|
opacity: .5;
|
|
transform: translateX(calc(50% * var(--before, -1) * -1));
|
|
pointer-events: none;
|
|
}
|
|
|
|
&::before {
|
|
--before: 1;
|
|
counter-reset: x var(--min);
|
|
left: #{$track-height};
|
|
}
|
|
|
|
&::after {
|
|
counter-reset: x var(--max);
|
|
right: #{$track-height};
|
|
}
|
|
}
|
|
|
|
.outputContainer {
|
|
position: absolute;
|
|
top: 0;
|
|
left: #{$track-height};
|
|
right: #{$track-height};
|
|
height: #{$track-height};
|
|
pointer-events: none;
|
|
}
|
|
|
|
.output {
|
|
pointer-events: none;
|
|
position: absolute;
|
|
z-index: 5;
|
|
width: #{$thumb-size};
|
|
height: #{$thumb-size};
|
|
left: calc((((var(--value) - var(--min)) / (var(--max) - var(--min))) * 100%) - #{calc($thumb-size / 2)});
|
|
bottom: #{calc($thumb-size / 2 + 6px)};
|
|
text-align: center;
|
|
}
|
|
|
|
|
|
|
|
.progress {
|
|
--completed-a: calc((clamp(var(--min), var(--value, 0), var(--max)) - var(--min)) / (var(--max) - var(--min)) * 100);
|
|
--completed-b: calc((var(--value) - var(--min)) / (var(--max) - var(--min)) * 100);
|
|
--cb: max(var(--completed-a), var(--completed-b));
|
|
--start-end: #{$track-height};
|
|
--clip-end: calc(100% - (var(--cb)) * 1%);
|
|
--clip: inset(-20px var(--clip-end) -20px 0);
|
|
|
|
position: absolute;
|
|
width: 100%;
|
|
height: #{$track-height};
|
|
background: var(--text-color);
|
|
border-radius: #{$track-height};
|
|
z-index: -1;
|
|
|
|
|
|
&::before {
|
|
content: "";
|
|
position: absolute;
|
|
left: 0;
|
|
right: 0;
|
|
clip-path: var(--clip);
|
|
top: 0;
|
|
bottom: 0;
|
|
background: var(--text-secondary);
|
|
z-index: 1;
|
|
border-radius: inherit;
|
|
}
|
|
}
|
|
|
|
.input {
|
|
--thumb-shadow: 0 0 3px rgba(0, 0, 0, 0.4), 0 0 1px rgba(0, 0, 0, 0.5) inset, 0 0 0 99px var(--text-color) inset;
|
|
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: #{$thumb-size};
|
|
margin: 0;
|
|
position: absolute;
|
|
left: 0;
|
|
cursor: grab;
|
|
outline: none;
|
|
background: none;
|
|
|
|
@mixin thumb {
|
|
appearance: none;
|
|
height: #{$thumb-size};
|
|
width: #{$thumb-size};
|
|
transform: translateY(-5px);
|
|
border-radius: 50%;
|
|
background: var(--text-color);
|
|
box-shadow: var(--thumb-shadow);
|
|
border: none;
|
|
pointer-events: auto;
|
|
}
|
|
|
|
&::-webkit-slider-thumb {
|
|
@include thumb;
|
|
}
|
|
|
|
&::-moz-range-thumb {
|
|
@include thumb;
|
|
}
|
|
|
|
&::-ms-thumb {
|
|
@include thumb;
|
|
}
|
|
|
|
&:active {
|
|
--thumb-shadow: 0 0 0 #{calc($thumb-size / 4)} inset var(--text-color), 0 0 0 99px var(--text-secondary) inset, 0 0 3px rgba(0, 0, 0, 0.4);
|
|
cursor: grabbing;
|
|
}
|
|
} |