Skip to content

Commit 6741093

Browse files
committed
test(range): update custom test to check styles instead of screenshots
1 parent d5b2570 commit 6741093

8 files changed

Lines changed: 414 additions & 5 deletions

core/src/components/range/test/custom/index.html

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<script type="module" src="../../../../../dist/ionic/ionic.esm.js"></script>
1515
</head>
1616
<style>
17+
/* 1st Custom Range */
1718
.range-part::part(bar) {
1819
background: red;
1920
}
@@ -51,6 +52,148 @@
5152
.md.range-part::part(pin)::before {
5253
background: orange;
5354
}
55+
56+
/* 2nd Custom Range: Single Knob */
57+
.custom-knobs {
58+
--color-blue-light: #3b82f6;
59+
--color-blue-primary: var(--ion-color-primary, #0054e9);
60+
--color-blue-dark: #1e3a8a;
61+
}
62+
63+
.custom-knobs::part(knob-handle) {
64+
--custom-knob-width: 50px;
65+
--custom-knob-height: 25px;
66+
67+
width: var(--custom-knob-width);
68+
height: var(--custom-knob-height);
69+
70+
/* Center vertically */
71+
top: calc((var(--height) - var(--custom-knob-height)) / 2);
72+
73+
/* Center horizontally */
74+
margin-inline-start: calc(0px - var(--custom-knob-width) / 2);
75+
76+
transform-origin: center center;
77+
}
78+
79+
.custom-knobs::part(knob) {
80+
background: rgba(255, 255, 255, 0.5);
81+
backdrop-filter: blur(10px);
82+
83+
inset: 0;
84+
85+
width: 100%;
86+
height: 100%;
87+
88+
/* MD scales smaller by default, make iOS scale to match */
89+
transform: scale(0.67);
90+
91+
border-radius: 4px;
92+
border: 1px solid rgba(3, 60, 89, 0.5);
93+
}
94+
95+
/* Pressed knob */
96+
.custom-knobs::part(knob pressed) {
97+
background: var(--color-blue-primary);
98+
}
99+
100+
/* Hover/focus indicator */
101+
.custom-knobs::part(knob)::before {
102+
width: 100%;
103+
height: 100%;
104+
border-radius: inherit;
105+
}
106+
107+
/* Pressed/focused knob hover/focus indicator */
108+
.custom-knobs::part(knob pressed)::before,
109+
.custom-knobs::part(knob focused)::before {
110+
transform: scale(1);
111+
}
112+
113+
/* TODO hover states */
114+
115+
/* iOS offset is larger than MD due to not having a bottom arrow */
116+
.ios.custom-knobs {
117+
--pin-offset: 8px;
118+
}
119+
120+
.md.custom-knobs {
121+
--pin-offset: 4px;
122+
}
123+
124+
.ios.custom-knobs {
125+
padding-top: 40px;
126+
}
127+
128+
.ios.custom-knobs::part(pin) {
129+
border-radius: 50%;
130+
background-color: var(--color-blue-primary);
131+
color: #fff;
132+
}
133+
134+
/* 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) {
137+
transform: translate3d(0, calc(-100% - (var(--custom-knob-height) / 2) + var(--pin-offset)), 0) scale(1);
138+
}
139+
140+
.custom-knobs [slot='start'] {
141+
margin-inline-end: 36px;
142+
}
143+
144+
.custom-knobs [slot='end'] {
145+
margin-inline-start: 36px;
146+
}
147+
148+
/* 3rd Custom Range: Dual Knobs */
149+
.custom-knobs.range-dual-knobs::part(knob-a) {
150+
border-radius: 50% 0 0 50%;
151+
}
152+
153+
.custom-knobs.range-dual-knobs::part(knob-b) {
154+
border-radius: 0 50% 50% 0;
155+
}
156+
157+
/* Pressed knob a */
158+
.custom-knobs::part(knob-a pressed) {
159+
background: var(--color-blue-light);
160+
}
161+
162+
/* Pressed knob b */
163+
.custom-knobs::part(knob-b pressed) {
164+
background: var(--color-blue-dark);
165+
}
166+
167+
.custom-knobs.range-dual-knobs::part(pin-a),
168+
.custom-knobs.range-dual-knobs::part(pin-a):before {
169+
background: var(--color-blue-light);
170+
}
171+
172+
.custom-knobs.range-dual-knobs::part(pin-b),
173+
.custom-knobs.range-dual-knobs::part(pin-b):before {
174+
background: var(--color-blue-dark);
175+
}
176+
177+
/* Displayed knob values */
178+
.custom-knobs.range-dual-knobs .knob-value {
179+
display: flex;
180+
align-items: center;
181+
justify-content: center;
182+
183+
width: 36px;
184+
height: 36px;
185+
186+
border: 1px solid #000;
187+
border-radius: 4px;
188+
}
189+
190+
.custom-knobs.range-dual-knobs [slot='start'] {
191+
border-color: var(--color-blue-light);
192+
}
193+
194+
.custom-knobs.range-dual-knobs [slot='end'] {
195+
border-color: var(--color-blue-dark);
196+
}
54197
</style>
55198
<body>
56199
<ion-app>
@@ -61,6 +204,7 @@
61204
</ion-header>
62205

63206
<ion-content class="ion-padding">
207+
<!-- 1st Custom Range -->
64208
<ion-range
65209
class="range-part"
66210
min="-200"
@@ -71,6 +215,38 @@
71215
dual-knobs="true"
72216
aria-label="Custom Range"
73217
></ion-range>
218+
219+
<!-- 2nd Custom Range: Single Knob -->
220+
<ion-range
221+
id="single-knob-range"
222+
class="custom-knobs"
223+
step="5"
224+
snaps="true"
225+
pin="true"
226+
value="50"
227+
aria-label="Custom Range"
228+
>
229+
<span slot="start">
230+
<ion-icon name="volume-off" size="large" color="primary"></ion-icon>
231+
</span>
232+
<span slot="end">
233+
<ion-icon name="volume-high" size="large" color="primary"></ion-icon>
234+
</span>
235+
</ion-range>
236+
237+
<!-- 3rd Custom Range: Dual Knobs -->
238+
<ion-range
239+
id="dual-knobs-range"
240+
class="custom-knobs"
241+
step="5"
242+
snaps="true"
243+
pin="true"
244+
dual-knobs="true"
245+
aria-label="Custom Dual Knobs Range"
246+
>
247+
<div slot="start" class="knob-value"></div>
248+
<div slot="end" class="knob-value"></div>
249+
</ion-range>
74250
</ion-content>
75251
</ion-app>
76252

@@ -80,6 +256,23 @@
80256
lower: '-100',
81257
upper: '100',
82258
};
259+
260+
const dualKnobs = document.getElementById('dual-knobs-range');
261+
dualKnobs.value = {
262+
lower: '25',
263+
upper: '75',
264+
};
265+
266+
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;
269+
}
270+
271+
updateDisplayedKnobValues();
272+
273+
dualKnobs.addEventListener('ionChange', () => {
274+
updateDisplayedKnobValues();
275+
});
83276
</script>
84277
</body>
85278
</html>

0 commit comments

Comments
 (0)