Skip to content

Commit 69627b4

Browse files
authored
fix(ui5-slider): improve labels structure and placement (#11848)
1 parent 73c5126 commit 69627b4

File tree

5 files changed

+40
-44
lines changed

5 files changed

+40
-44
lines changed

packages/main/src/RangeSlider.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -953,13 +953,6 @@ class RangeSlider extends SliderBase implements IFormInputElement {
953953
endHandle: {
954954
[this.directionStart]: `${this._secondHandlePositionFromStart!}%`,
955955
},
956-
label: {
957-
"width": `${this._labelWidth}%`,
958-
},
959-
labelContainer: {
960-
"width": `100%`,
961-
[this.directionStart]: `-${this._labelWidth / 2}%`,
962-
},
963956
};
964957
}
965958
}

packages/main/src/Slider.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,6 @@ class Slider extends SliderBase implements IFormInputElement {
318318
handle: {
319319
[this.directionStart]: `${this._handlePositionFromStart}%`,
320320
},
321-
label: {
322-
"width": `${this._labelWidth}%`,
323-
},
324-
labelContainer: {
325-
"width": `100%`,
326-
[this.directionStart]: `-${this._labelWidth / 2}%`,
327-
},
328321
};
329322
}
330323

packages/main/src/SliderBase.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -206,12 +206,6 @@ abstract class SliderBase extends UI5Element {
206206

207207
_handleActionKeyPress(e: Event) {} // eslint-disable-line
208208

209-
// used in base template, but implemented in subclasses
210-
abstract styles: {
211-
label: Record<string, string>,
212-
labelContainer: Record<string, string>,
213-
};
214-
215209
abstract tickmarksObject: Array<boolean>;
216210
abstract _ariaLabelledByText: string;
217211

@@ -395,21 +389,28 @@ abstract class SliderBase extends UI5Element {
395389
// In such case the labels must correspond to the tickmarks, only the first and the last one should exist.
396390
if (spaceBetweenTickmarks < SliderBase.MIN_SPACE_BETWEEN_TICKMARKS) {
397391
this._hiddenTickmarks = true;
398-
this._labelsOverlapping = true;
399392
} else {
400393
this._hiddenTickmarks = false;
401394
}
402395

403396
if (this.labelInterval <= 0 || this._hiddenTickmarks) {
397+
this._labelsOverlapping = true;
404398
return;
405399
}
406400

407401
// Check if there are any overlapping labels.
408402
// If so - only the first and the last one should be visible
409-
const labelItems = this.shadowRoot!.querySelectorAll(".ui5-slider-labels li");
410-
this._labelsOverlapping = [...labelItems].some(label => label.scrollWidth > label.clientWidth);
411-
}
412403

404+
const remInPx = parseFloat(getComputedStyle(document.documentElement).fontSize); // calculate 1 rem in pixels
405+
const childWidthPx = 2 * remInPx; // as specified label must be 2 rems so calculate one child width in pixels
406+
407+
const labelItemsParent = this.shadowRoot!.querySelector(".ui5-slider-labels") as HTMLElement;
408+
409+
const labelItemsSumWidth = this._labels.length * childWidthPx; // all labels width
410+
const labelItemsParentWidth = labelItemsParent.clientWidth; // label parent width
411+
412+
this._labelsOverlapping = labelItemsParentWidth < labelItemsSumWidth;
413+
}
413414
/**
414415
* Called when the user starts interacting with the slider.
415416
* After a down event on the slider root, listen for move events on window, so the slider value

packages/main/src/SliderBaseTemplate.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,15 @@ export default function SliderBaseTemplate(this: SliderBase, hooks?: {
3535
</>)}
3636
</ul>
3737
{!!this.labelInterval &&
38-
<ul class={{
39-
"ui5-slider-labels": true,
40-
"ui5-slider-hidden-labels": this._labelsOverlapping,
41-
}}
42-
style={this.styles.labelContainer}
43-
>
44-
{this._labels.map(l =>
45-
<li style={this.styles.label}>{l}</li>
46-
)}
47-
</ul>
38+
<ul class={{
39+
"ui5-slider-labels": true,
40+
"ui5-slider-hidden-labels": this._labelsOverlapping,
41+
}}
42+
>
43+
{this._labels.map(l =>
44+
<li data-counter={l}></li>
45+
)}
46+
</ul>
4847
}
4948
</>}
5049

packages/main/src/themes/SliderBase.css

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393

9494
.ui5-slider-tickmarks li {
9595
height: var(--_ui5_slider_tickmark_height);
96-
border-inline-start: 1px solid var(--_ui5_slider_tickmark_bg);
96+
border-inline-start: 0.0625rem solid var(--_ui5_slider_tickmark_bg);
9797
}
9898

9999
.ui5-slider-handle {
@@ -203,28 +203,38 @@
203203
margin: 0;
204204
padding: 0;
205205
white-space: nowrap;
206+
height: 1rem;
207+
width: 100%;
208+
display: flex;
209+
justify-content: space-between;
206210
}
207211

208212
.ui5-slider-labels li {
209-
position: relative;
213+
position: relative;
210214
list-style: none;
211-
padding-top: 0.3125rem;
212-
height: 1rem;
213215
margin: 0;
214216
text-align: center;
215217
display: inline-block;
216-
color: var(--_ui5_slider_label_color);
217218
font-family: var(--sapFontFamily);
218219
font-size: var(--_ui5_slider_label_fontsize);
219220
padding-top: 0;
220221
box-sizing: border-box;
221-
display: inline-flex;
222-
justify-content: center;
223-
align-items: center;
224-
vertical-align: top;
222+
width: 0.0625rem;
223+
visibility: hidden;
224+
}
225+
226+
.ui5-slider-labels li::after {
227+
content: attr(data-counter);
228+
position: absolute;
229+
top: 0;
230+
visibility: visible;
231+
display: inline-block;
232+
width: 2rem;
233+
color: var(--_ui5_slider_label_color);
234+
transform: translateX(-50%);
225235
}
226236

227-
.ui5-slider-hidden-labels li:not(:first-child):not(:last-child) {
237+
.ui5-slider-hidden-labels li:not(:first-child):not(:last-child)::after {
228238
visibility: hidden;
229239
}
230240

0 commit comments

Comments
 (0)