From 663deb2694b454fbf59a253b05fbbd522b9c9ea4 Mon Sep 17 00:00:00 2001 From: mhartington Date: Wed, 30 Aug 2017 18:35:22 -0400 Subject: [PATCH] feat(range): basic range component --- .../core/src/components/range/range-knob.tsx | 73 ++++ .../core/src/components/range/range.md.scss | 279 +++++++++++++ packages/core/src/components/range/range.scss | 56 +++ packages/core/src/components/range/range.tsx | 383 ++++++++++++++++++ .../core/src/components/range/test/basic.html | 38 ++ packages/core/src/utils/helpers.ts | 6 +- packages/core/stencil.config.js | 1 + 7 files changed, 835 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/components/range/range-knob.tsx create mode 100644 packages/core/src/components/range/range.md.scss create mode 100644 packages/core/src/components/range/range.scss create mode 100644 packages/core/src/components/range/range.tsx create mode 100644 packages/core/src/components/range/test/basic.html 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 [ + , +