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