-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathRange.svelte
114 lines (104 loc) · 2.65 KB
/
Range.svelte
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<label
{...$$restProps}
id="range-{fid}"
class="is-{validity}"
class:form-inline={inline}
style="--range: {range}; --min: {min}; --max: {max}"
data-range={range}
>
<slot />
<input class="slider" type="range" bind:value={range} {min} {max} on:input on:change />
</label>
<script lang="ts" context="module">
import uuid from '../../helpers/uuid';
type Validity = 'success' | 'error' | false;
export type { Validity };
</script>
<script lang="ts">
export let range: number = 50;
export let min: number = 0;
export let max: number = 100;
export let inline: boolean = false;
export let validity: Validity = false;
const fid: string = uuid();
</script>
<style lang="scss">
@import '@spectre-org/spectre-css/src/sliders';
label {
display: block;
position: relative;
&:not([data-tooltip]) {
&::after {
content: attr(data-range);
position: absolute;
left: calc(100% / calc((var(--max) - var(--min)) / (var(--range) - var(--min))));
bottom: 150%;
color: $light-color;
background: rgba($dark-color, 0.95);
padding: $unit-1 $unit-2;
border-radius: $border-radius;
transform: translateX(-50%);
transition: opacity 250ms, transform 250ms, bottom 250ms;
opacity: 0;
}
}
&:hover,
&:active {
&:not([data-tooltip]) {
&::after {
opacity: 1;
bottom: 100%;
}
}
}
}
input[type='range'] {
width: 100%;
// webkit
&::-webkit-slider-runnable-track {
height: 3px;
background: linear-gradient(
to right,
$primary-color
calc(100% / calc((var(--max) - var(--min)) / (var(--range) - var(--min)))),
$bg-color-dark
calc(100% / calc((var(--max) - var(--min)) / (var(--range) - var(--min))))
);
}
&::-webkit-slider-thumb {
transform: scale(1.25);
box-shadow: 0 0 0 0pt rgba($primary-color, 0.27);
transition: transform 250ms, box-shadow 250ms;
}
&:hover::-webkit-slider-thumb {
transform: scale(1.5);
}
&:active::-webkit-slider-thumb {
transform: scale(1.25);
box-shadow: 0 0 0 3pt rgba($primary-color, 0.27);
}
// moz
&::-moz-range-track {
height: 3px;
background: linear-gradient(
to right,
$primary-color
calc(100% / calc((var(--max) - var(--min)) / (var(--range) - var(--min)))),
$bg-color-dark
calc(100% / calc((var(--max) - var(--min)) / (var(--range) - var(--min))))
);
}
&::-moz-range-thumb {
transform: scale(1.25);
box-shadow: 0 0 0 0pt rgba($primary-color, 0.27);
transition: transform 250ms, box-shadow 250ms;
}
&:hover::-moz-range-thumb {
transform: scale(1.5);
}
&:active::-moz-range-thumb {
transform: scale(1.25);
box-shadow: 0 0 0 3pt rgba($primary-color, 0.27);
}
}
</style>