mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-15 17:42:15 +08:00
74 lines
1.8 KiB
TypeScript
74 lines
1.8 KiB
TypeScript
import { Component, Event, EventEmitter, Listen, Prop } from '@stencil/core';
|
|
|
|
@Component({
|
|
tag: `ion-range-knob`
|
|
})
|
|
export class RangeKnob {
|
|
|
|
@Prop() pressed = false;
|
|
@Prop() pin = false;
|
|
@Prop() min!: number;
|
|
@Prop() max!: number;
|
|
@Prop() val!: number;
|
|
@Prop() disabled = false;
|
|
@Prop() labelId!: string;
|
|
@Prop() knob!: 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, knob: this.knob});
|
|
ev.preventDefault();
|
|
ev.stopPropagation();
|
|
} else if (keyCode === KEY_RIGHT || keyCode === KEY_UP) {
|
|
this.ionIncrease.emit({isIncrease: true, knob: this.knob});
|
|
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)
|
|
},
|
|
'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 [
|
|
<div class="range-pin" role="presentation">{this.val}</div>,
|
|
<div class="range-knob" role="presentation" />
|
|
];
|
|
}
|
|
return <div class="range-knob" role="presentation" />;
|
|
}
|
|
}
|
|
|
|
export const KEY_LEFT = 37;
|
|
export const KEY_UP = 38;
|
|
export const KEY_RIGHT = 39;
|
|
export const KEY_DOWN = 40;
|