|
7 | 7 | export let step = 1; |
8 | 8 | export let values = [(max + min) / 2]; |
9 | 9 | export let vertical = false; |
| 10 | + export let hoverable = true; |
| 11 | + export let disabled = false; |
10 | 12 |
|
11 | 13 | // range pips / values props |
12 | 14 | export let pipstep = undefined; |
|
22 | 24 |
|
23 | 25 | // stylistic props |
24 | 26 | export let focus = undefined; |
| 27 | +
|
| 28 | + // methods |
25 | 29 | export let percentOf = undefined; |
| 30 | + export let moveHandle = undefined; |
26 | 31 |
|
27 | 32 | $: pipStep = pipstep || ((max - min) / step >= ( vertical ? 50 : 100 ) ? (max - min) / ( vertical ? 10 : 20 ) : 1); |
28 | 33 |
|
|
45 | 50 | return values[0] < val && values[1] > val; |
46 | 51 | } |
47 | 52 | }; |
| 53 | +
|
| 54 | + function labelClick(val) { |
| 55 | + moveHandle( undefined, val ); |
| 56 | + } |
48 | 57 | </script> |
49 | 58 |
|
50 | 59 | <style> |
|
53 | 62 | --pip-text: var(--range-pip-text, var(--pip)); |
54 | 63 | --pip-active: var(--range-pip-active, darkslategrey); |
55 | 64 | --pip-active-text: var(--range-pip-active-text, var(--pip-active)); |
| 65 | + --pip-hover: var(--range-pip-hover, darkslategrey); |
| 66 | + --pip-hover-text: var(--range-pip-hover-text, var(--pip-hover)); |
56 | 67 | --pip-in-range: var(--range-pip-in-range, var(--pip-active)); |
57 | 68 | --pip-in-range-text: var(--range-pip-in-range-text, var(--pip-active-text)); |
58 | 69 | } |
|
84 | 95 | top: 0; |
85 | 96 | left: 0.25em; |
86 | 97 | } |
87 | | - :global(.rangePips .pip.selected) { |
88 | | - height: 0.75em; |
89 | | - } |
90 | | - :global(.rangePips.vertical .pip.selected) { |
91 | | - height: 1px; |
92 | | - width: 0.75em; |
93 | | - } |
94 | 98 | :global(.rangePips .pipVal) { |
95 | 99 | position: absolute; |
96 | 100 | top: 0.4em; |
|
102 | 106 | left: 0.4em; |
103 | 107 | transform: translate(25%, -50%); |
104 | 108 | } |
105 | | - :global(.rangePips .pip.selected .pipVal) { |
106 | | - font-weight: bold; |
107 | | - top: 0.75em; |
108 | | - } |
109 | | - :global(.rangePips.vertical .pip.selected .pipVal) { |
110 | | - top: 0; |
111 | | - left: 0.75em; |
112 | | - } |
113 | 109 | :global(.rangePips .pip) { |
114 | 110 | transition: all 0.15s ease; |
115 | 111 | } |
116 | 112 | :global(.rangePips .pipVal) { |
117 | | - transition: all 0.15s ease; |
| 113 | + transition: all 0.15s ease, font-weight 0s linear; |
118 | 114 | } |
119 | 115 | :global(.rangePips .pip) { |
120 | 116 | color: lightslategray; |
|
128 | 124 | background-color: darkslategrey; |
129 | 125 | background-color: var(--pip-active); |
130 | 126 | } |
| 127 | + :global(.rangePips.hoverable:not(.disabled) .pip:hover) { |
| 128 | + color: darkslategrey; |
| 129 | + color: var(--pip-hover-text); |
| 130 | + background-color: darkslategrey; |
| 131 | + background-color: var(--pip-hover); |
| 132 | + } |
131 | 133 | :global(.rangePips .pip.in-range) { |
132 | 134 | color: darkslategrey; |
133 | 135 | color: var(--pip-in-range-text); |
134 | 136 | background-color: darkslategrey; |
135 | 137 | background-color: var(--pip-in-range); |
136 | 138 | } |
| 139 | + :global(.rangePips .pip.selected) { |
| 140 | + height: 0.75em; |
| 141 | + } |
| 142 | + :global(.rangePips.vertical .pip.selected) { |
| 143 | + height: 1px; |
| 144 | + width: 0.75em; |
| 145 | + } |
| 146 | + :global(.rangePips .pip.selected .pipVal) { |
| 147 | + font-weight: bold; |
| 148 | + top: 0.75em; |
| 149 | + } |
| 150 | + :global(.rangePips.vertical .pip.selected .pipVal) { |
| 151 | + top: 0; |
| 152 | + left: 0.75em; |
| 153 | + } |
| 154 | + :global(.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover) { |
| 155 | + transition: none; |
| 156 | + } |
| 157 | + :global(.rangePips.hoverable:not(.disabled) .pip:not(.selected):hover .pipVal) { |
| 158 | + transition: none; |
| 159 | + font-weight: bold; |
| 160 | + } |
137 | 161 | </style> |
138 | 162 |
|
139 | | -<div class="rangePips" class:focus class:vertical> |
| 163 | +<div |
| 164 | + class="rangePips" |
| 165 | + class:disabled |
| 166 | + class:hoverable |
| 167 | + class:vertical |
| 168 | + class:focus |
| 169 | +> |
140 | 170 | {#if ( all && first !== false ) || first } |
141 | 171 | <span |
142 | 172 | class="pip first" |
143 | 173 | class:selected={isSelected(min)} |
144 | 174 | class:in-range={inRange(min)} |
145 | | - style="{vertical ? 'top' : 'left'}: 0%;"> |
| 175 | + style="{vertical ? 'top' : 'left'}: 0%;" |
| 176 | + on:click={labelClick(min)} |
| 177 | + on:touchend|preventDefault={labelClick(min)} |
| 178 | + > |
146 | 179 | {#if all === 'label' || first === 'label'} |
147 | 180 | <span class="pipVal"> |
148 | 181 | {#if prefix}<span class="pipVal-prefix">{prefix}</span>{/if}{formatter(min,0)}{#if suffix}<span class="pipVal-suffix">{suffix}</span>{/if} |
149 | 182 | </span> |
150 | 183 | {/if} |
151 | 184 | </span> |
152 | 185 | {/if} |
| 186 | + |
153 | 187 | {#if ( all && rest !== false ) || rest} |
154 | 188 | {#each Array(pipCount + 1) as _, i} |
155 | 189 | {#if pipVal(i) !== min && pipVal(i) !== max} |
156 | 190 | <span |
157 | 191 | class="pip" |
158 | 192 | class:selected={isSelected(pipVal(i))} |
159 | 193 | class:in-range={inRange(pipVal(i))} |
160 | | - style="{vertical ? 'top' : 'left'}: {percentOf(pipVal(i))}%;"> |
| 194 | + style="{vertical ? 'top' : 'left'}: {percentOf(pipVal(i))}%;" |
| 195 | + on:click={labelClick(pipVal(i))} |
| 196 | + on:touchend|preventDefault={labelClick(pipVal(i))} |
| 197 | + > |
161 | 198 | {#if all === 'label' || rest === 'label'} |
162 | 199 | <span class="pipVal"> |
163 | 200 | {#if prefix}<span class="pipVal-prefix">{prefix}</span>{/if}{formatter(pipVal(i),i)}{#if suffix}<span class="pipVal-suffix">{suffix}</span>{/if} |
|
167 | 204 | {/if} |
168 | 205 | {/each} |
169 | 206 | {/if} |
| 207 | + |
170 | 208 | {#if ( all && last !== false ) || last} |
171 | 209 | <span |
172 | 210 | class="pip last" |
173 | 211 | class:selected={isSelected(max)} |
174 | 212 | class:in-range={inRange(max)} |
175 | | - style="{vertical ? 'top' : 'left'}: 100%;"> |
| 213 | + style="{vertical ? 'top' : 'left'}: 100%;" |
| 214 | + on:click={labelClick(max)} |
| 215 | + on:touchend|preventDefault={labelClick(max)} |
| 216 | + > |
176 | 217 | {#if all === 'label' || last === 'label'} |
177 | 218 | <span class="pipVal"> |
178 | 219 | {#if prefix}<span class="pipVal-prefix">{prefix}</span>{/if}{formatter(max,pipCount)}{#if suffix}<span class="pipVal-suffix">{suffix}</span>{/if} |
179 | 220 | </span> |
180 | 221 | {/if} |
181 | 222 | </span> |
182 | 223 | {/if} |
| 224 | + |
183 | 225 | </div> |
0 commit comments