@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
186 lines • 15.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, ViewChild, ElementRef, HostListener, Output, EventEmitter, Input } from '@angular/core';
import { hexToRgb, rgbToHsv, rgbToHex } from './color-utils';
export class ColorSlider {
constructor() {
this.baseClass = true;
this.mousedown = false;
this.hueChange = new EventEmitter();
}
/**
* @param {?} evt
* @return {?}
*/
onMouseUp(evt) {
this.mousedown = false;
}
/**
* @return {?}
*/
draw() {
if (!this.ctx) {
this.ctx = this.canvas.nativeElement.getContext('2d');
}
/** @type {?} */
const width = this.canvas.nativeElement.width;
/** @type {?} */
const height = this.canvas.nativeElement.height;
this.ctx.clearRect(0, 0, width, height);
/** @type {?} */
const gradient = this.ctx.createLinearGradient(0, 0, 0, height);
gradient.addColorStop(0, 'rgba(255, 0, 0, 1)');
gradient.addColorStop(0.17, 'rgba(255, 255, 0, 1)');
gradient.addColorStop(0.34, 'rgba(0, 255, 0, 1)');
gradient.addColorStop(0.51, 'rgba(0, 255, 255, 1)');
gradient.addColorStop(0.68, 'rgba(0, 0, 255, 1)');
gradient.addColorStop(0.85, 'rgba(255, 0, 255, 1)');
gradient.addColorStop(1, 'rgba(255, 0, 0, 1)');
this.ctx.beginPath();
this.ctx.rect(0, 0, width, height);
this.ctx.fillStyle = gradient;
this.ctx.fill();
this.ctx.closePath();
if (this.selectedHeight) {
this.ctx.beginPath();
this.ctx.strokeStyle = 'white';
this.ctx.lineWidth = 4;
this.ctx.rect(0, this.selectedHeight - 5, width, 10);
this.ctx.stroke();
this.ctx.closePath();
}
}
/**
* @param {?} evt
* @return {?}
*/
onMouseDown(evt) {
this.mousedown = true;
this.selectedHeight = evt.offsetY;
this.draw();
this.emitHue(evt.offsetY);
}
/**
* @param {?} evt
* @return {?}
*/
onMouseMove(evt) {
if (this.mousedown) {
this.selectedHeight = evt.offsetY;
this.draw();
this.emitHue(evt.offsetY);
}
}
/**
* @param {?} y
* @return {?}
*/
emitHue(y) {
if (y < 0) {
y = 0;
}
else if (y >= 250) {
y = 249;
}
/** @type {?} */
const color = this.getColorAtPosition(y);
this.hueChange.emit(rgbToHex(color.r, color.g, color.b));
}
/**
* @param {?} y
* @return {?}
*/
getColorAtPosition(y) {
/** @type {?} */
const imageData = this.ctx.getImageData(5, y, 1, 1).data;
return {
r: imageData[0],
g: imageData[1],
b: imageData[2],
};
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.hue && !changes.hue.isFirstChange()) {
/** @type {?} */
const rgbColor = hexToRgb(this.hue);
if (rgbColor) {
/** @type {?} */
const hsvColor = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
/** @type {?} */
const hueFactor = hsvColor.h / 360;
this.selectedHeight = hueFactor * 250;
this.draw();
}
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
if (this.hue) {
/** @type {?} */
const rgbColor = hexToRgb(this.hue);
/** @type {?} */
const hsvColor = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
/** @type {?} */
const hueFactor = hsvColor.h / 360;
this.selectedHeight = hueFactor * 250;
}
this.draw();
}
}
ColorSlider.decorators = [
{ type: Component, args: [{
selector: 'suka-color-slider',
template: `
<canvas
#canvas
class="color-slider"
width="20"
height="250"
(mousedown)="onMouseDown($event)"
(mousemove)="onMouseMove($event)"
>
</canvas>
`
}] }
];
ColorSlider.propDecorators = {
baseClass: [{ type: HostBinding, args: ['class.color-slider-wrapper',] }],
hue: [{ type: Input }],
hueChange: [{ type: Output }],
canvas: [{ type: ViewChild, args: ['canvas', { static: false },] }],
onMouseUp: [{ type: HostListener, args: ['window:mouseup', ['$event'],] }]
};
if (false) {
/** @type {?} */
ColorSlider.prototype.baseClass;
/**
* @type {?}
* @private
*/
ColorSlider.prototype.ctx;
/**
* @type {?}
* @private
*/
ColorSlider.prototype.mousedown;
/**
* @type {?}
* @private
*/
ColorSlider.prototype.selectedHeight;
/** @type {?} */
ColorSlider.prototype.hue;
/** @type {?} */
ColorSlider.prototype.hueChange;
/** @type {?} */
ColorSlider.prototype.canvas;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3Itc2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9jb2xvci1waWNrZXIvY29sb3Itc2xpZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsRUFFVixZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFDWixLQUFLLEVBR04sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBZ0I3RCxNQUFNLE9BQU8sV0FBVztJQWR4QjtRQWU2QyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXBELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJaEIsY0FBUyxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO0lBbUdqRSxDQUFDOzs7OztJQTlGQyxTQUFTLENBQUMsR0FBZTtRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDOzs7O0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkQ7O2NBRUssS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUs7O2NBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDOztjQUVsQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFB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Q0FBQztJQUNkLENBQUM7OztZQXZIRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7YUFDRjs7O3dCQUVFLFdBQVcsU0FBQyw0QkFBNEI7a0JBS3hDLEtBQUs7d0JBQ0wsTUFBTTtxQkFFTixTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzt3QkFFbkMsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBVjFDLGdDQUE0RDs7Ozs7SUFDNUQsMEJBQXNDOzs7OztJQUN0QyxnQ0FBMEI7Ozs7O0lBQzFCLHFDQUErQjs7SUFFL0IsMEJBQXFCOztJQUNyQixnQ0FBK0Q7O0lBRS9ELDZCQUE0RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG9zdEJpbmRpbmcsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgSG9zdExpc3RlbmVyLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgaGV4VG9SZ2IsIHJnYlRvSHN2LCByZ2JUb0hleCB9IGZyb20gJy4vY29sb3ItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWNvbG9yLXNsaWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGNhbnZhc1xuICAgICAgI2NhbnZhc1xuICAgICAgY2xhc3M9XCJjb2xvci1zbGlkZXJcIlxuICAgICAgd2lkdGg9XCIyMFwiXG4gICAgICBoZWlnaHQ9XCIyNTBcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvY2FudmFzPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENvbG9yU2xpZGVyIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb2xvci1zbGlkZXItd3JhcHBlcicpIGJhc2VDbGFzcyA9IHRydWU7XG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgbW91c2Vkb3duID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0ZWRIZWlnaHQ6IG51bWJlcjtcblxuICBASW5wdXQoKSBodWU6IHN0cmluZztcbiAgQE91dHB1dCgpIGh1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnY2FudmFzJywge3N0YXRpYzogZmFsc2V9KSBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2dDogTW91c2VFdmVudCkge1xuICAgIHRoaXMubW91c2Vkb3duID0gZmFsc2U7XG4gIH1cblxuICBkcmF3KCkge1xuICAgIGlmICghdGhpcy5jdHgpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmhlaWdodDtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBjb25zdCBncmFkaWVudCA9IHRoaXMuY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDAsIGhlaWdodCk7XG4gICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAsICdyZ2JhKDI1NSwgMCwgMCwgMSknKTtcbiAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoMC4xNywgJ3JnYmEoMjU1LCAyNTUsIDAsIDEpJyk7XG4gICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAuMzQsICdyZ2JhKDAsIDI1NSwgMCwgMSknKTtcbiAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoMC41MSwgJ3JnYmEoMCwgMjU1LCAyNTUsIDEpJyk7XG4gICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAuNjgsICdyZ2JhKDAsIDAsIDI1NSwgMSknKTtcbiAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoMC44NSwgJ3JnYmEoMjU1LCAwLCAyNTUsIDEpJyk7XG4gICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDEsICdyZ2JhKDI1NSwgMCwgMCwgMSknKTtcblxuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY3R4LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gZ3JhZGllbnQ7XG4gICAgdGhpcy5jdHguZmlsbCgpO1xuICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRIZWlnaHQpIHtcbiAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gNDtcbiAgICAgIHRoaXMuY3R4LnJlY3QoMCwgdGhpcy5zZWxlY3RlZEhlaWdodCAtIDUsIHdpZHRoLCAxMCk7XG4gICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VEb3duKGV2dDogTW91c2VFdmVudCkge1xuICAgIHRoaXMubW91c2Vkb3duID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkSGVpZ2h0ID0gZXZ0Lm9mZnNldFk7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5lbWl0SHVlKGV2dC5vZmZzZXRZKTtcbiAgfVxuXG4gIG9uTW91c2VNb3ZlKGV2dDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLm1vdXNlZG93bikge1xuICAgICAgdGhpcy5zZWxlY3RlZEhlaWdodCA9IGV2dC5vZmZzZXRZO1xuICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB0aGlzLmVtaXRIdWUoZXZ0Lm9mZnNldFkpO1xuICAgIH1cbiAgfVxuXG4gIGVtaXRIdWUoeTogbnVtYmVyKSB7XG4gICAgaWYgKHkgPCAwKSB7XG4gICAgICB5ID0gMDtcbiAgICB9IGVsc2UgaWYgKHkgPj0gMjUwKSB7XG4gICAgICB5ID0gMjQ5O1xuICAgIH1cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29sb3JBdFBvc2l0aW9uKHkpO1xuICAgIHRoaXMuaHVlQ2hhbmdlLmVtaXQocmdiVG9IZXgoY29sb3IuciwgY29sb3IuZywgY29sb3IuYikpO1xuICB9XG5cbiAgZ2V0Q29sb3JBdFBvc2l0aW9uKHk6IG51bWJlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSg1LCB5LCAxLCAxKS5kYXRhO1xuICAgIHJldHVybiB7XG4gICAgICByOiBpbWFnZURhdGFbMF0sXG4gICAgICBnOiBpbWFnZURhdGFbMV0sXG4gICAgICBiOiBpbWFnZURhdGFbMl0sXG4gICAgfTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5odWUgJiYgIWNoYW5nZXMuaHVlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgY29uc3QgcmdiQ29sb3IgPSBoZXhUb1JnYih0aGlzLmh1ZSk7XG4gICAgICBpZiAocmdiQ29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2Q29sb3IgPSByZ2JUb0hzdihyZ2JDb2xvci5yLCByZ2JDb2xvci5nLCByZ2JDb2xvci5iKTtcbiAgICAgICAgY29uc3QgaHVlRmFjdG9yID0gaHN2Q29sb3IuaCAvIDM2MDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEhlaWdodCA9IGh1ZUZhY3RvciAqIDI1MDtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmh1ZSkge1xuICAgICAgY29uc3QgcmdiQ29sb3IgPSBoZXhUb1JnYih0aGlzLmh1ZSk7XG4gICAgICBjb25zdCBoc3ZDb2xvciA9IHJnYlRvSHN2KHJnYkNvbG9yLnIsIHJnYkNvbG9yLmcsIHJnYkNvbG9yLmIpO1xuICAgICAgY29uc3QgaHVlRmFjdG9yID0gaHN2Q29sb3IuaCAvIDM2MDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRIZWlnaHQgPSBodWVGYWN0b3IgKiAyNTA7XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cbn1cbiJdfQ==