Skip to content

Commit 514a911

Browse files
authored
feat: add slider event types, JSDoc and typings tests (#10967)
1 parent 2dbd6d9 commit 514a911

File tree

7 files changed

+150
-0
lines changed

7 files changed

+150
-0
lines changed

packages/slider/src/vaadin-range-slider.d.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,54 @@ import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
88
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
99
import { SliderMixin } from './vaadin-slider-mixin.js';
1010

11+
/**
12+
* Fired when the user commits a value change.
13+
*/
14+
export type RangeSliderChangeEvent = Event & {
15+
target: RangeSlider;
16+
};
17+
18+
/**
19+
* Fired when the `value` property changes.
20+
*/
21+
export type RangeSliderValueChangedEvent = CustomEvent<{ value: number[] }>;
22+
23+
export interface RangeSliderCustomEventMap {
24+
'value-changed': RangeSliderValueChangedEvent;
25+
}
26+
27+
export interface RangeSliderEventMap extends HTMLElementEventMap, RangeSliderCustomEventMap {
28+
change: RangeSliderChangeEvent;
29+
}
30+
1131
/**
1232
* `<vaadin-range-slider>` is a web component that represents a range slider
1333
* for selecting a subset of the given range.
1434
*
1535
* ```html
1636
* <vaadin-range-slider min="0" max="100" step="1"></vaadin-range-slider>
1737
* ```
38+
*
39+
* @fires {Event} change - Fired when the user commits a value change.
40+
* @fires {CustomEvent} value-changed - Fired when the `value` property changes.
1841
*/
1942
declare class RangeSlider extends SliderMixin(FocusMixin(ThemableMixin(ElementMixin(HTMLElement)))) {
2043
/**
2144
* The value of the slider.
2245
*/
2346
value: number[];
47+
48+
addEventListener<K extends keyof RangeSliderEventMap>(
49+
type: K,
50+
listener: (this: RangeSlider, ev: RangeSliderEventMap[K]) => void,
51+
options?: AddEventListenerOptions | boolean,
52+
): void;
53+
54+
removeEventListener<K extends keyof RangeSliderEventMap>(
55+
type: K,
56+
listener: (this: RangeSlider, ev: RangeSliderEventMap[K]) => void,
57+
options?: EventListenerOptions | boolean,
58+
): void;
2459
}
2560

2661
declare global {

packages/slider/src/vaadin-range-slider.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import { SliderMixin } from './vaadin-slider-mixin.js';
2424
* <vaadin-range-slider min="0" max="100" step="1"></vaadin-range-slider>
2525
* ```
2626
*
27+
* @fires {Event} change - Fired when the user commits a value change.
28+
* @fires {CustomEvent} value-changed - Fired when the `value` property changes.
29+
*
2730
* @customElement
2831
* @extends HTMLElement
2932
* @mixes ElementMixin

packages/slider/src/vaadin-slider-mixin.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,10 @@ export const SliderMixin = (superClass) =>
111111
__onChange(event) {
112112
event.stopPropagation();
113113
}
114+
115+
/**
116+
* Fired when the user commits a value change.
117+
*
118+
* @event change
119+
*/
114120
};

packages/slider/src/vaadin-slider.d.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,54 @@ import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
88
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
99
import { SliderMixin } from './vaadin-slider-mixin.js';
1010

11+
/**
12+
* Fired when the user commits a value change.
13+
*/
14+
export type SliderChangeEvent = Event & {
15+
target: Slider;
16+
};
17+
18+
/**
19+
* Fired when the `value` property changes.
20+
*/
21+
export type SliderValueChangedEvent = CustomEvent<{ value: number }>;
22+
23+
export interface SliderCustomEventMap {
24+
'value-changed': SliderValueChangedEvent;
25+
}
26+
27+
export interface SliderEventMap extends HTMLElementEventMap, SliderCustomEventMap {
28+
change: SliderChangeEvent;
29+
}
30+
1131
/**
1232
* `<vaadin-slider>` is a web component that represents a range slider
1333
* for selecting numerical values within a defined range.
1434
*
1535
* ```html
1636
* <vaadin-slider min="0" max="100" step="1"></vaadin-slider>
1737
* ```
38+
*
39+
* @fires {Event} change - Fired when the user commits a value change.
40+
* @fires {CustomEvent} value-changed - Fired when the `value` property changes.
1841
*/
1942
declare class Slider extends SliderMixin(FocusMixin(ThemableMixin(ElementMixin(HTMLElement)))) {
2043
/**
2144
* The value of the slider.
2245
*/
2346
value: number;
47+
48+
addEventListener<K extends keyof SliderEventMap>(
49+
type: K,
50+
listener: (this: Slider, ev: SliderEventMap[K]) => void,
51+
options?: AddEventListenerOptions | boolean,
52+
): void;
53+
54+
removeEventListener<K extends keyof SliderEventMap>(
55+
type: K,
56+
listener: (this: Slider, ev: SliderEventMap[K]) => void,
57+
options?: EventListenerOptions | boolean,
58+
): void;
2459
}
2560

2661
declare global {

packages/slider/src/vaadin-slider.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import { SliderMixin } from './vaadin-slider-mixin.js';
2323
* <vaadin-slider min="0" max="100" step="1"></vaadin-slider>
2424
* ```
2525
*
26+
* @fires {Event} change - Fired when the user commits a value change.
27+
* @fires {CustomEvent} value-changed - Fired when the `value` property changes.
28+
*
2629
* @customElement
2730
* @extends HTMLElement
2831
* @mixes ElementMixin
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import '../../vaadin-range-slider.js';
2+
import type { FocusMixinClass } from '@vaadin/a11y-base/src/focus-mixin.js';
3+
import type { ElementMixinClass } from '@vaadin/component-base/src/element-mixin.js';
4+
import type { ThemableMixinClass } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
5+
import type { SliderMixinClass } from '../../src/vaadin-slider-mixin.js';
6+
import type { RangeSlider, RangeSliderChangeEvent, RangeSliderValueChangedEvent } from '../../vaadin-range-slider.js';
7+
8+
const assertType = <TExpected>(actual: TExpected) => actual;
9+
10+
const slider = document.createElement('vaadin-range-slider');
11+
12+
assertType<RangeSlider>(slider);
13+
14+
slider.addEventListener('value-changed', (event) => {
15+
assertType<RangeSliderValueChangedEvent>(event);
16+
assertType<number[]>(event.detail.value);
17+
});
18+
19+
slider.addEventListener('change', (event) => {
20+
assertType<RangeSliderChangeEvent>(event);
21+
assertType<RangeSlider>(event.target);
22+
});
23+
24+
// Properties
25+
assertType<number>(slider.max);
26+
assertType<number>(slider.min);
27+
assertType<number>(slider.step);
28+
assertType<number[]>(slider.value);
29+
30+
// Mixins
31+
assertType<ElementMixinClass>(slider);
32+
assertType<FocusMixinClass>(slider);
33+
assertType<ThemableMixinClass>(slider);
34+
assertType<SliderMixinClass>(slider);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import '../../vaadin-slider.js';
2+
import type { FocusMixinClass } from '@vaadin/a11y-base/src/focus-mixin.js';
3+
import type { ElementMixinClass } from '@vaadin/component-base/src/element-mixin.js';
4+
import type { ThemableMixinClass } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
5+
import type { SliderMixinClass } from '../../src/vaadin-slider-mixin.js';
6+
import type { Slider, SliderChangeEvent, SliderValueChangedEvent } from '../../vaadin-slider.js';
7+
8+
const assertType = <TExpected>(actual: TExpected) => actual;
9+
10+
const slider = document.createElement('vaadin-slider');
11+
12+
assertType<Slider>(slider);
13+
14+
slider.addEventListener('value-changed', (event) => {
15+
assertType<SliderValueChangedEvent>(event);
16+
assertType<number>(event.detail.value);
17+
});
18+
19+
slider.addEventListener('change', (event) => {
20+
assertType<SliderChangeEvent>(event);
21+
assertType<Slider>(event.target);
22+
});
23+
24+
// Properties
25+
assertType<number>(slider.max);
26+
assertType<number>(slider.min);
27+
assertType<number>(slider.step);
28+
assertType<number>(slider.value);
29+
30+
// Mixins
31+
assertType<ElementMixinClass>(slider);
32+
assertType<FocusMixinClass>(slider);
33+
assertType<ThemableMixinClass>(slider);
34+
assertType<SliderMixinClass>(slider);

0 commit comments

Comments
 (0)