Skip to content

Commit 5abfa06

Browse files
authored
Merge pull request #364 from youda97/slider-skeleton
feat(slider): Add skeleton state
2 parents cbe402e + c75dcbf commit 5abfa06

File tree

2 files changed

+66
-34
lines changed

2 files changed

+66
-34
lines changed

src/slider/slider.component.ts

Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -47,43 +47,60 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
4747
@Component({
4848
selector: "ibm-slider",
4949
template: `
50-
<div
51-
class="bx--slider"
52-
[ngClass]="{'bx--slider--disabled': disabled}">
50+
<ng-container *ngIf="!skeleton; else skeletonTemplate">
5351
<div
54-
#thumb
55-
class="bx--slider__thumb"
56-
tabindex="0"
57-
[ngStyle]="{'left.%': getFractionComplete() * 100}"
58-
(mousedown)="onMouseDown($event)"
59-
(keydown)="onKeyDown($event)">
52+
class="bx--slider"
53+
[ngClass]="{'bx--slider--disabled': disabled}">
54+
<div
55+
#thumb
56+
class="bx--slider__thumb"
57+
tabindex="0"
58+
[ngStyle]="{'left.%': getFractionComplete() * 100}"
59+
(mousedown)="onMouseDown($event)"
60+
(keydown)="onKeyDown($event)">
61+
</div>
62+
<div
63+
#track
64+
class="bx--slider__track"
65+
(click)="onClick($event)">
66+
</div>
67+
<div
68+
class="bx--slider__filled-track"
69+
[ngStyle]="{transform: 'translate(0%, -50%)' + scaleX(getFractionComplete())}">
70+
</div>
71+
<input
72+
#range
73+
aria-label="slider"
74+
class="bx--slider__input"
75+
type="range"
76+
[step]="step"
77+
[min]="min"
78+
[max]="max"
79+
[value]="value">
6080
</div>
61-
<div
62-
#track
63-
class="bx--slider__track"
64-
(click)="onClick($event)">
65-
</div>
66-
<div
67-
class="bx--slider__filled-track"
68-
[ngStyle]="{transform: 'translate(0%, -50%)' + scaleX(getFractionComplete())}">
81+
<label [id]="bottomRangeId" class="bx--slider__range-label">
82+
<ng-content select="[minLabel]"></ng-content>
83+
</label>
84+
<label [id]="topRangeId" class="bx--slider__range-label">
85+
<ng-content select="[maxLabel]"></ng-content>
86+
</label>
87+
<ng-content select="input"></ng-content>
88+
</ng-container>
89+
90+
<ng-template #skeletonTemplate>
91+
<div class="bx--form-item">
92+
<label class="bx--label bx--skeleton"></label>
93+
<div class="bx--slider-container bx--skeleton">
94+
<span class="bx--slider__range-label"></span>
95+
<div class="bx--slider">
96+
<div class="bx--slider__thumb"></div>
97+
<div class="bx--slider__track"></div>
98+
<div class="bx--slider__filled-track"></div>
99+
</div>
100+
<span class="bx--slider__range-label"></span>
101+
</div>
69102
</div>
70-
<input
71-
#range
72-
aria-label="slider"
73-
class="bx--slider__input"
74-
type="range"
75-
[step]="step"
76-
[min]="min"
77-
[max]="max"
78-
[value]="value">
79-
</div>
80-
<label [id]="bottomRangeId" class="bx--slider__range-label">
81-
<ng-content select="[minLabel]"></ng-content>
82-
</label>
83-
<label [id]="topRangeId" class="bx--slider__range-label">
84-
<ng-content select="[maxLabel]"></ng-content>
85-
</label>
86-
<ng-content select="input"></ng-content>
103+
</ng-template>
87104
`,
88105
providers: [
89106
{
@@ -130,6 +147,8 @@ export class Slider implements AfterViewInit, OnDestroy, ControlValueAccessor {
130147
@Input() id = `slider-${Slider.count++}`;
131148
/** Value used to "multiply" the `step` when using arrow keys to select values */
132149
@Input() shiftMultiplier = 4;
150+
/** Set to `true` for a loading slider */
151+
@Input() skeleton = false;
133152
/** Disables the range visually and functionally */
134153
@Input() set disabled(v) {
135154
this._disabled = v;
@@ -214,6 +233,10 @@ export class Slider implements AfterViewInit, OnDestroy, ControlValueAccessor {
214233

215234
/** Returns the amount of "completeness" as a fraction of the total track width */
216235
getFractionComplete() {
236+
if (!this.track) {
237+
return 0;
238+
}
239+
217240
const trackWidth = this.track.nativeElement.getBoundingClientRect().width;
218241
return this.slidAmount / trackWidth;
219242
}
@@ -236,6 +259,10 @@ export class Slider implements AfterViewInit, OnDestroy, ControlValueAccessor {
236259

237260
/** Converts a given "real" value to a px value we can update the view with */
238261
convertToPx(value) {
262+
if (!this.track) {
263+
return 0;
264+
}
265+
239266
const trackWidth = this.track.nativeElement.getBoundingClientRect().width;
240267
if (value >= this.max) {
241268
return trackWidth;

src/slider/slider.stories.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,9 @@ storiesOf("Slider", module).addDecorator(moduleMetadata({
5151
model: 0,
5252
disabled: boolean("disabled", false)
5353
}
54+
}))
55+
.add("Skeleton", () => ({
56+
template: `
57+
<ibm-slider skeleton="true"></ibm-slider>
58+
`
5459
}));

0 commit comments

Comments
 (0)