diff --git a/packages/core/src/components/range/range-knob.tsx b/packages/core/src/components/range/range-knob.tsx new file mode 100644 index 0000000000..f374804add --- /dev/null +++ b/packages/core/src/components/range/range-knob.tsx @@ -0,0 +1,73 @@ +import { Component, Event, EventEmitter, Listen, Prop } from '@stencil/core'; + +@Component({ + tag: `ion-range-knob` +}) +export class RangeKnob { + @Prop() pressed: boolean; + @Prop() pin: boolean; + @Prop() min: number; + @Prop() max: number; + @Prop() val: number; + @Prop() disabled: boolean; + @Prop() labelId: string; + @Prop() ratio: number; + + @Event() ionIncrease: EventEmitter; + @Event() ionDecrease: EventEmitter; + + @Listen('keydown') + handleKeyBoard(ev: KeyboardEvent) { + const keyCode = ev.keyCode; + if (keyCode === KEY_LEFT || keyCode === KEY_DOWN) { + this.ionDecrease.emit({isIncrease: false}); + ev.preventDefault(); + ev.stopPropagation(); + } else if (keyCode === KEY_RIGHT || keyCode === KEY_UP) { + this.ionIncrease.emit({isIncrease: true}); + ev.preventDefault(); + ev.stopPropagation(); + } + } + + leftPos(val: number) { + return `${val * 100}%`; + } + + hostData() { + return { + class: { + 'range-knob-pressed': this.pressed, + 'range-knob-min': this.val === this.min || this.val === undefined, + 'range-knob-max': this.val === this.max + }, + style: { + left: this.leftPos(this.ratio) + }, + attrs: { + role: 'slider', + tabindex: this.disabled ? -1 : 0, + 'aria-valuemin': `${this.min}`, + 'aria-valuemax': `${this.max}`, + 'aria-disabled': `${this.disabled}`, + 'aria-labelledby': `${this.labelId}`, + 'aria-valuenow': `${this.val}` + } + }; + } + + render() { + if (this.pin) { + return [ + , +