UNPKG

@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
/** * @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==