|
14 | 14 | <script type="module" src="../../../../../dist/ionic/ionic.esm.js"></script> |
15 | 15 | </head> |
16 | 16 | <style> |
17 | | - /* 1st Custom Range */ |
| 17 | + h2 { |
| 18 | + font-size: 12px; |
| 19 | + font-weight: normal; |
| 20 | + |
| 21 | + color: #6f7378; |
| 22 | + |
| 23 | + margin-top: 10px; |
| 24 | + margin-left: 5px; |
| 25 | + } |
| 26 | + |
| 27 | + /** |
| 28 | + * 1st Custom Range: All Parts |
| 29 | + * ----------------------------------- |
| 30 | + */ |
18 | 31 | .range-part::part(bar) { |
19 | 32 | background: red; |
20 | 33 | } |
|
53 | 66 | background: orange; |
54 | 67 | } |
55 | 68 |
|
56 | | - /* 2nd Custom Range: Single Knob */ |
57 | | - .custom-knobs { |
| 69 | + /** |
| 70 | + * Shared Custom Knob Styles |
| 71 | + * ----------------------------------- |
| 72 | + */ |
| 73 | + .custom-knobs-range { |
58 | 74 | --color-blue-light: #3b82f6; |
59 | 75 | --color-blue-primary: var(--ion-color-primary, #0054e9); |
60 | 76 | --color-blue-dark: #1e3a8a; |
61 | 77 | } |
62 | 78 |
|
63 | | - .custom-knobs::part(knob-handle) { |
| 79 | + .custom-knobs-range::part(knob-handle) { |
64 | 80 | --custom-knob-width: 50px; |
65 | 81 | --custom-knob-height: 25px; |
66 | 82 |
|
|
76 | 92 | transform-origin: center center; |
77 | 93 | } |
78 | 94 |
|
79 | | - .custom-knobs::part(knob) { |
| 95 | + .custom-knobs-range::part(knob) { |
80 | 96 | background: rgba(255, 255, 255, 0.5); |
81 | 97 | backdrop-filter: blur(10px); |
82 | 98 |
|
|
93 | 109 | } |
94 | 110 |
|
95 | 111 | /* Pressed knob */ |
96 | | - .custom-knobs::part(knob pressed) { |
| 112 | + .custom-knobs-range::part(knob pressed) { |
97 | 113 | background: var(--color-blue-primary); |
98 | 114 | } |
99 | 115 |
|
100 | 116 | /* Hover/focus indicator */ |
101 | | - .custom-knobs::part(knob)::before { |
| 117 | + .custom-knobs-range::part(knob)::before { |
102 | 118 | width: 100%; |
103 | 119 | height: 100%; |
104 | 120 | border-radius: inherit; |
105 | 121 | } |
106 | 122 |
|
107 | 123 | /* Pressed/focused knob hover/focus indicator */ |
108 | | - .custom-knobs::part(knob pressed)::before, |
109 | | - .custom-knobs::part(knob focused)::before { |
| 124 | + .custom-knobs-range::part(knob pressed)::before, |
| 125 | + .custom-knobs-range::part(knob focused)::before { |
110 | 126 | transform: scale(1); |
111 | 127 | } |
112 | 128 |
|
| 129 | + /* Displayed knob values */ |
| 130 | + .custom-knobs-range .knob-value { |
| 131 | + display: flex; |
| 132 | + align-items: center; |
| 133 | + justify-content: center; |
| 134 | + |
| 135 | + width: 36px; |
| 136 | + height: 36px; |
| 137 | + |
| 138 | + border: 1px solid #000; |
| 139 | + border-radius: 4px; |
| 140 | + } |
| 141 | + |
113 | 142 | /* TODO hover states */ |
114 | 143 |
|
115 | 144 | /* iOS offset is larger than MD due to not having a bottom arrow */ |
116 | | - .ios.custom-knobs { |
| 145 | + .ios.custom-knobs-range { |
117 | 146 | --pin-offset: 8px; |
118 | 147 | } |
119 | 148 |
|
120 | | - .md.custom-knobs { |
| 149 | + .md.custom-knobs-range { |
121 | 150 | --pin-offset: 4px; |
122 | 151 | } |
123 | 152 |
|
124 | | - .ios.custom-knobs { |
| 153 | + .ios.custom-knobs-range { |
125 | 154 | padding-top: 40px; |
126 | 155 | } |
127 | 156 |
|
128 | | - .ios.custom-knobs::part(pin) { |
| 157 | + .ios.custom-knobs-range::part(pin) { |
129 | 158 | border-radius: 50%; |
130 | 159 | background-color: var(--color-blue-primary); |
131 | 160 | color: #fff; |
132 | 161 | } |
133 | 162 |
|
134 | 163 | /* Move the pin up so it sits above the taller custom knob when pressed/focused */ |
135 | | - .custom-knobs::part(pin pressed), |
136 | | - .custom-knobs::part(pin focused) { |
| 164 | + .custom-knobs-range::part(pin pressed), |
| 165 | + .custom-knobs-range::part(pin focused) { |
137 | 166 | transform: translate3d(0, calc(-100% - (var(--custom-knob-height) / 2) + var(--pin-offset)), 0) scale(1); |
138 | 167 | } |
139 | 168 |
|
140 | | - .custom-knobs [slot='start'] { |
| 169 | + .custom-knobs-range [slot='start'] { |
141 | 170 | margin-inline-end: 36px; |
142 | 171 | } |
143 | 172 |
|
144 | | - .custom-knobs [slot='end'] { |
| 173 | + .custom-knobs-range [slot='end'] { |
145 | 174 | margin-inline-start: 36px; |
146 | 175 | } |
147 | 176 |
|
148 | | - /* 3rd Custom Range: Dual Knobs */ |
149 | | - .custom-knobs.range-dual-knobs::part(knob-a) { |
| 177 | + /** |
| 178 | + * 2nd Custom Range: Single Knob |
| 179 | + * ----------------------------------- |
| 180 | + */ |
| 181 | + |
| 182 | + /* Pressed knob */ |
| 183 | + #single-knob-range::part(knob pressed) { |
| 184 | + background: var(--color-blue-primary); |
| 185 | + } |
| 186 | + |
| 187 | + /** |
| 188 | + * 3rd Custom Range: Dual Knobs |
| 189 | + * Knobs Lower & Upper |
| 190 | + * ----------------------------------- |
| 191 | + */ |
| 192 | + |
| 193 | + /* Knob lower */ |
| 194 | + #lower-upper-dual-knobs-range::part(knob-lower) { |
150 | 195 | border-radius: 50% 0 0 50%; |
151 | 196 | } |
152 | 197 |
|
153 | | - .custom-knobs.range-dual-knobs::part(knob-b) { |
| 198 | + /* Knob upper */ |
| 199 | + #lower-upper-dual-knobs-range::part(knob-upper) { |
154 | 200 | border-radius: 0 50% 50% 0; |
155 | 201 | } |
156 | 202 |
|
157 | | - /* Pressed knob a */ |
158 | | - .custom-knobs::part(knob-a pressed) { |
| 203 | + /* Pressed knob lower */ |
| 204 | + #lower-upper-dual-knobs-range::part(knob-lower pressed) { |
159 | 205 | background: var(--color-blue-light); |
160 | 206 | } |
161 | 207 |
|
162 | | - /* Pressed knob b */ |
163 | | - .custom-knobs::part(knob-b pressed) { |
| 208 | + /* Pressed knob upper */ |
| 209 | + #lower-upper-dual-knobs-range::part(knob-upper pressed) { |
164 | 210 | background: var(--color-blue-dark); |
165 | 211 | } |
166 | 212 |
|
167 | | - .custom-knobs.range-dual-knobs::part(pin-a), |
168 | | - .custom-knobs.range-dual-knobs::part(pin-a):before { |
| 213 | + /* Pin lower */ |
| 214 | + #lower-upper-dual-knobs-range.range-dual-knobs::part(pin-lower), |
| 215 | + #lower-upper-dual-knobs-range.range-dual-knobs::part(pin-lower):before { |
169 | 216 | background: var(--color-blue-light); |
170 | 217 | } |
171 | 218 |
|
172 | | - .custom-knobs.range-dual-knobs::part(pin-b), |
173 | | - .custom-knobs.range-dual-knobs::part(pin-b):before { |
| 219 | + /* Pin upper */ |
| 220 | + #lower-upper-dual-knobs-range.range-dual-knobs::part(pin-upper), |
| 221 | + #lower-upper-dual-knobs-range.range-dual-knobs::part(pin-upper):before { |
174 | 222 | background: var(--color-blue-dark); |
175 | 223 | } |
176 | 224 |
|
177 | | - /* Displayed knob values */ |
178 | | - .custom-knobs.range-dual-knobs .knob-value { |
179 | | - display: flex; |
180 | | - align-items: center; |
181 | | - justify-content: center; |
| 225 | + /** |
| 226 | + * 4th Custom Range: Dual Knobs |
| 227 | + * Knobs A & B |
| 228 | + * ----------------------------------- |
| 229 | + */ |
182 | 230 |
|
183 | | - width: 36px; |
184 | | - height: 36px; |
| 231 | + /* Pressed knob A */ |
| 232 | + #a-b-dual-knobs-range::part(knob-a pressed) { |
| 233 | + background: var(--color-blue-light); |
| 234 | + } |
185 | 235 |
|
186 | | - border: 1px solid #000; |
187 | | - border-radius: 4px; |
| 236 | + /* Pressed knob B */ |
| 237 | + #a-b-dual-knobs-range::part(knob-b pressed) { |
| 238 | + background: var(--color-blue-dark); |
188 | 239 | } |
189 | 240 |
|
190 | | - .custom-knobs.range-dual-knobs [slot='start'] { |
191 | | - border-color: var(--color-blue-light); |
| 241 | + /* Pin A */ |
| 242 | + #a-b-dual-knobs-range.range-dual-knobs::part(pin-a), |
| 243 | + #a-b-dual-knobs-range.range-dual-knobs::part(pin-a):before { |
| 244 | + background: var(--color-blue-light); |
192 | 245 | } |
193 | 246 |
|
194 | | - .custom-knobs.range-dual-knobs [slot='end'] { |
195 | | - border-color: var(--color-blue-dark); |
| 247 | + /* Pin B */ |
| 248 | + #a-b-dual-knobs-range.range-dual-knobs::part(pin-b), |
| 249 | + #a-b-dual-knobs-range.range-dual-knobs::part(pin-b):before { |
| 250 | + background: var(--color-blue-dark); |
196 | 251 | } |
197 | 252 | </style> |
198 | 253 | <body> |
|
205 | 260 |
|
206 | 261 | <ion-content class="ion-padding"> |
207 | 262 | <!-- 1st Custom Range --> |
| 263 | + <h2>Custom Range</h2> |
208 | 264 | <ion-range |
209 | 265 | class="range-part" |
210 | 266 | min="-200" |
|
217 | 273 | ></ion-range> |
218 | 274 |
|
219 | 275 | <!-- 2nd Custom Range: Single Knob --> |
| 276 | + <h2>Custom Range: Single Knob</h2> |
220 | 277 | <ion-range |
221 | 278 | id="single-knob-range" |
222 | | - class="custom-knobs" |
| 279 | + class="custom-knobs-range" |
223 | 280 | step="5" |
224 | 281 | snaps="true" |
225 | 282 | pin="true" |
|
234 | 291 | </span> |
235 | 292 | </ion-range> |
236 | 293 |
|
237 | | - <!-- 3rd Custom Range: Dual Knobs --> |
| 294 | + <!-- 3rd Custom Range: Dual Knobs with Knob Lower & Upper --> |
| 295 | + <h2>Custom Range: Dual Knobs with Knob Lower & Upper</h2> |
238 | 296 | <ion-range |
239 | | - id="dual-knobs-range" |
240 | | - class="custom-knobs" |
| 297 | + id="lower-upper-dual-knobs-range" |
| 298 | + class="custom-knobs-range range-lower-upper-knobs" |
| 299 | + step="5" |
| 300 | + snaps="true" |
| 301 | + pin="true" |
| 302 | + dual-knobs="true" |
| 303 | + aria-label="Custom Lower & Upper Knobs Range" |
| 304 | + > |
| 305 | + <div slot="start" class="knob-value"></div> |
| 306 | + <div slot="end" class="knob-value"></div> |
| 307 | + </ion-range> |
| 308 | + |
| 309 | + <!-- 4th Custom Range: Dual Knobs with Knob A & B --> |
| 310 | + <h2>Custom Range: Dual Knobs with Knob A & B</h2> |
| 311 | + <ion-range |
| 312 | + id="a-b-dual-knobs-range" |
| 313 | + class="custom-knobs-range" |
241 | 314 | step="5" |
242 | 315 | snaps="true" |
243 | 316 | pin="true" |
|
257 | 330 | upper: '100', |
258 | 331 | }; |
259 | 332 |
|
260 | | - const dualKnobs = document.getElementById('dual-knobs-range'); |
261 | | - dualKnobs.value = { |
| 333 | + const lowerUpperKnobs = document.getElementById('lower-upper-dual-knobs-range'); |
| 334 | + lowerUpperKnobs.value = { |
| 335 | + lower: '40', |
| 336 | + upper: '60', |
| 337 | + }; |
| 338 | + |
| 339 | + const abDualKnobs = document.getElementById('a-b-dual-knobs-range'); |
| 340 | + abDualKnobs.value = { |
262 | 341 | lower: '25', |
263 | 342 | upper: '75', |
264 | 343 | }; |
265 | 344 |
|
266 | 345 | function updateDisplayedKnobValues() { |
267 | | - document.querySelector('#dual-knobs-range [slot="start"]').textContent = dualKnobs.value.lower; |
268 | | - document.querySelector('#dual-knobs-range [slot="end"]').textContent = dualKnobs.value.upper; |
| 346 | + document.querySelector('#lower-upper-dual-knobs-range [slot="start"]').textContent = |
| 347 | + lowerUpperKnobs.value.lower; |
| 348 | + document.querySelector('#lower-upper-dual-knobs-range [slot="end"]').textContent = lowerUpperKnobs.value.upper; |
| 349 | + document.querySelector('#a-b-dual-knobs-range [slot="start"]').textContent = abDualKnobs.value.lower; |
| 350 | + document.querySelector('#a-b-dual-knobs-range [slot="end"]').textContent = abDualKnobs.value.upper; |
269 | 351 | } |
270 | 352 |
|
271 | 353 | updateDisplayedKnobValues(); |
272 | 354 |
|
273 | | - dualKnobs.addEventListener('ionChange', () => { |
| 355 | + lowerUpperKnobs.addEventListener('ionChange', () => { |
| 356 | + updateDisplayedKnobValues(); |
| 357 | + }); |
| 358 | + |
| 359 | + abDualKnobs.addEventListener('ionChange', () => { |
274 | 360 | updateDisplayedKnobValues(); |
275 | 361 | }); |
276 | 362 | </script> |
|
0 commit comments