|
1 | 1 | <script> |
2 | | - export let values; |
3 | | - export let min; |
4 | | - export let max; |
5 | | - export let step; |
6 | | - export let range; |
| 2 | +
|
| 3 | + // range slider props |
| 4 | + export let range = false; |
| 5 | + export let min = 0; |
| 6 | + export let max = 100; |
| 7 | + export let step = 1; |
| 8 | + export let values = [(max + min) / 2]; |
| 9 | + export let vertical = false; |
| 10 | +
|
| 11 | + // range pips / values props |
| 12 | + export let pipstep = ((max - min) / step >= ( vertical ? 50 : 100 ) ? (max - min) / ( vertical ? 10 : 20 ) : 1); |
7 | 13 | export let first = true; |
8 | 14 | export let last = true; |
9 | 15 | export let rest = true; |
10 | | - export let pipstep = (max - min) / step >= 100 ? (max - min) / 20 : 1; |
11 | 16 |
|
| 17 | + // formatting props |
12 | 18 | export let prefix = ""; |
13 | 19 | export let suffix = ""; |
14 | 20 | export let formatter = v => v; |
15 | 21 |
|
| 22 | + // stylistic props |
16 | 23 | export let focus; |
17 | 24 | export let percentOf; |
18 | 25 |
|
|
46 | 53 | --pip-in-range: var(--range-pip-in-range, var(--pip-active)); |
47 | 54 | --pip-in-range-text: var(--range-pip-in-range-text, var(--pip-active-text)); |
48 | 55 | } |
49 | | - .rangeSlider__pips { |
| 56 | + :global(.rangeSlider__pips) { |
50 | 57 | height: 1em; |
51 | 58 | position: absolute; |
52 | 59 | left: 0; |
53 | 60 | right: 0; |
54 | 61 | bottom: -1em; |
55 | 62 | } |
56 | | - .rangeSlider__pip { |
| 63 | + :global(.rangeSlider__pips.vertical) { |
| 64 | + height: auto; |
| 65 | + width: 1em; |
| 66 | + position: absolute; |
| 67 | + left: 100%; |
| 68 | + right: auto; |
| 69 | + top: 0; |
| 70 | + bottom: 0; |
| 71 | + } |
| 72 | + :global(.rangeSlider__pips .pip) { |
57 | 73 | height: 0.4em; |
58 | 74 | position: absolute; |
59 | 75 | top: 0.25em; |
60 | 76 | width: 1px; |
61 | 77 | white-space: nowrap; |
62 | 78 | } |
63 | | - .rangeSlider__pip.selected { |
| 79 | + :global(.rangeSlider__pips.vertical .pip) { |
| 80 | + height: 1px; |
| 81 | + width: 0.4em; |
| 82 | + top: 0; |
| 83 | + left: 0.25em; |
| 84 | + } |
| 85 | + :global(.rangeSlider__pips .pip.selected) { |
64 | 86 | height: 0.75em; |
65 | 87 | } |
66 | | - .rangeSlider__pipval { |
| 88 | + :global(.rangeSlider__pips.vertical .pip.selected) { |
| 89 | + height: 1px; |
| 90 | + width: 0.75em; |
| 91 | + } |
| 92 | + :global(.rangeSlider__pips .pipVal) { |
67 | 93 | position: absolute; |
68 | 94 | top: 0.4em; |
69 | 95 | transform: translate(-50%, 25%); |
70 | 96 | } |
71 | | - .rangeSlider__pip.selected .rangeSlider__pipval { |
| 97 | + :global(.rangeSlider__pips.vertical .pipVal) { |
| 98 | + position: absolute; |
| 99 | + top: 0; |
| 100 | + left: 0.4em; |
| 101 | + transform: translate(25%, -50%); |
| 102 | + } |
| 103 | + :global(.rangeSlider__pips .pip.selected .pipVal) { |
72 | 104 | font-weight: bold; |
73 | 105 | top: 0.75em; |
74 | 106 | } |
75 | | - .rangeSlider__pip, |
76 | | - .rangeSlider__pipval { |
| 107 | + :global(.rangeSlider__pips.vertical .pip.selected .pipVal) { |
| 108 | + top: 0; |
| 109 | + left: 0.75em; |
| 110 | + } |
| 111 | + :global(.rangeSlider__pips .pip, .rangeSlider__pips .pipVal) { |
77 | 112 | transition: all 0.15s ease; |
78 | 113 | } |
79 | | - .rangeSlider__pip { |
| 114 | + :global(.rangeSlider__pips .pip) { |
80 | 115 | color: lightslategray; |
81 | 116 | color: var(--pip-text); |
82 | 117 | background-color: lightslategray; |
83 | 118 | background-color: var(--pip); |
84 | 119 | } |
85 | | - .rangeSlider__pip.selected { |
| 120 | + :global(.rangeSlider__pips .pip.selected) { |
86 | 121 | color: darkslategrey; |
87 | 122 | color: var(--pip-active-text); |
88 | 123 | background-color: darkslategrey; |
89 | 124 | background-color: var(--pip-active); |
90 | 125 | } |
91 | | - .rangeSlider__pip.in-range { |
| 126 | + :global(.rangeSlider__pips .pip.in-range) { |
92 | 127 | color: darkslategrey; |
93 | 128 | color: var(--pip-in-range-text); |
94 | 129 | background-color: darkslategrey; |
95 | 130 | background-color: var(--pip-in-range); |
96 | 131 | } |
97 | 132 | </style> |
98 | 133 |
|
99 | | -<div class="rangeSlider__pips" class:focus> |
| 134 | +<div class="rangeSlider__pips" class:focus class:vertical> |
100 | 135 | {#if first} |
101 | 136 | <span |
102 | | - class="rangeSlider__pip is-first" |
| 137 | + class="pip first" |
103 | 138 | class:selected={isSelected(min)} |
104 | 139 | class:in-range={inRange(min)} |
105 | | - style="left: 0%;"> |
| 140 | + style="{vertical ? 'top' : 'left'}: 0%;"> |
106 | 141 | {#if first === 'label'} |
107 | | - <span class="rangeSlider__pipval"> |
| 142 | + <span class="pipVal"> |
108 | 143 | {prefix}{formatter(min)}{suffix} |
109 | 144 | </span> |
110 | 145 | {/if} |
|
114 | 149 | {#each Array(pipCount + 1) as _, i} |
115 | 150 | {#if pipVal(i) !== min && pipVal(i) !== max} |
116 | 151 | <span |
117 | | - class="rangeSlider__pip" |
| 152 | + class="pip" |
118 | 153 | class:selected={isSelected(pipVal(i))} |
119 | 154 | class:in-range={inRange(pipVal(i))} |
120 | | - style="left: {percentOf(pipVal(i))}%;"> |
| 155 | + style="{vertical ? 'top' : 'left'}: {percentOf(pipVal(i))}%;"> |
121 | 156 | {#if rest === 'label'} |
122 | | - <span class="rangeSlider__pipval"> |
| 157 | + <span class="pipVal"> |
123 | 158 | {prefix}{formatter(pipVal(i))}{suffix} |
124 | 159 | </span> |
125 | 160 | {/if} |
|
129 | 164 | {/if} |
130 | 165 | {#if last} |
131 | 166 | <span |
132 | | - class="rangeSlider__pip is-last" |
| 167 | + class="pip last" |
133 | 168 | class:selected={isSelected(max)} |
134 | 169 | class:in-range={inRange(max)} |
135 | | - style="left: 100%;"> |
| 170 | + style="{vertical ? 'top' : 'left'}: 100%;"> |
136 | 171 | {#if last === 'label'} |
137 | | - <span class="rangeSlider__pipval"> |
| 172 | + <span class="pipVal"> |
138 | 173 | {prefix}{formatter(max)}{suffix} |
139 | 174 | </span> |
140 | 175 | {/if} |
|
0 commit comments