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>

209 lines 19.1 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, rgbToHex, rgbToHsv } from './color-utils'; export class ColorPalette { constructor() { this.baseClass = true; this.colorChange = new EventEmitter(true); 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; if (this.hue) { this.ctx.fillStyle = this.hue; } else { this.ctx.fillStyle = '#ff0000'; } this.ctx.fillRect(0, 0, width, height); /** @type {?} */ const whiteGrad = this.ctx.createLinearGradient(0, 0, width, 0); whiteGrad.addColorStop(0, 'rgba(255,255,255,1)'); whiteGrad.addColorStop(1, 'rgba(255,255,255,0)'); this.ctx.fillStyle = whiteGrad; this.ctx.fillRect(0, 0, width, height); /** @type {?} */ const blackGrad = this.ctx.createLinearGradient(0, 0, 0, height); blackGrad.addColorStop(0, 'rgba(0,0,0,0)'); blackGrad.addColorStop(1, 'rgba(0,0,0,1)'); this.ctx.fillStyle = blackGrad; this.ctx.fillRect(0, 0, width, height); if (this.selectedPosition) { this.ctx.strokeStyle = 'white'; this.ctx.fillStyle = 'white'; this.ctx.beginPath(); this.ctx.arc(this.selectedPosition.x, this.selectedPosition.y, 5, 0, 2 * Math.PI); this.ctx.lineWidth = 3; this.ctx.stroke(); this.ctx.closePath(); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.color && !changes.color.isFirstChange()) { /** @type {?} */ const rgbColor = hexToRgb(this.color); if (rgbColor) { /** @type {?} */ const hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b); this.selectedPosition = { x: (hsv.s * 250) / 100, y: 250 - (hsv.v * 250) / 100 }; this.draw(); } } else if (changes.hue && !changes.hue.isFirstChange()) { this.draw(); /** @type {?} */ const pos = this.selectedPosition; if (pos) { this.colorChange.emit(this.getColorAtPosition(pos.x, pos.y)); } } } /** * @return {?} */ ngAfterViewInit() { if (this.color) { /** @type {?} */ const rgbColor = hexToRgb(this.color); if (rgbColor) { /** @type {?} */ const hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b); this.selectedPosition = { x: (hsv.s * 250) / 100, y: 250 - (hsv.v * 250) / 100 }; } } this.draw(); } /** * @param {?} evt * @return {?} */ onMouseUp(evt) { this.mousedown = false; } /** * @param {?} evt * @return {?} */ onMouseDown(evt) { this.mousedown = true; /** @type {?} */ const xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX; /** @type {?} */ const yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY; this.selectedPosition = { x: xPos, y: yPos, }; this.draw(); this.emitColor(xPos, yPos); } /** * @param {?} evt * @return {?} */ onMouseMove(evt) { if (this.mousedown) { /** @type {?} */ const xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX; /** @type {?} */ const yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY; this.selectedPosition = { x: xPos, y: yPos, }; this.draw(); this.emitColor(xPos, yPos); } } /** * @param {?} x * @param {?} y * @return {?} */ emitColor(x, y) { /** @type {?} */ const rgbaColor = this.getColorAtPosition(x, y); this.colorChange.emit(rgbaColor); } /** * @param {?} x * @param {?} y * @return {?} */ getColorAtPosition(x, y) { /** @type {?} */ const imageData = this.ctx.getImageData(x, y, 1, 1).data; return rgbToHex(imageData[0], imageData[1], imageData[2]); } } ColorPalette.decorators = [ { type: Component, args: [{ selector: 'suka-color-palette', template: ` <canvas #canvas class="color-palette" width="250" height="250" (mousedown)="onMouseDown($event)" (mousemove)="onMouseMove($event)" > </canvas> ` }] } ]; ColorPalette.propDecorators = { baseClass: [{ type: HostBinding, args: ['class.color-palette-container',] }], hue: [{ type: Input }], color: [{ type: Input }], colorChange: [{ type: Output }], canvas: [{ type: ViewChild, args: ['canvas', { static: false },] }], onMouseUp: [{ type: HostListener, args: ['window:mouseup', ['$event'],] }] }; if (false) { /** @type {?} */ ColorPalette.prototype.baseClass; /** @type {?} */ ColorPalette.prototype.hue; /** @type {?} */ ColorPalette.prototype.color; /** @type {?} */ ColorPalette.prototype.colorChange; /** @type {?} */ ColorPalette.prototype.canvas; /** * @type {?} * @private */ ColorPalette.prototype.ctx; /** * @type {?} * @private */ ColorPalette.prototype.mousedown; /** @type {?} */ ColorPalette.prototype.selectedPosition; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsZXR0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvY29sb3ItcGlja2VyL2NvbG9yLXBhbGV0dGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUVaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQVksTUFBTSxlQUFlLENBQUM7QUFnQnZFLE1BQU0sT0FBTyxZQUFZO0lBZHpCO1FBZWdELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFLckQsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFNN0QsY0FBUyxHQUFHLEtBQUssQ0FBQztJQWtJNUIsQ0FBQzs7OztJQTlIQyxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2RDs7Y0FFSyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSzs7Y0FDdkMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU07UUFFL0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENB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QyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7Ozs7SUFFRCxrQkFBa0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUzs7Y0FDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDeEQsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDOzs7WUEzSkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO2FBQ0Y7Ozt3QkFFRSxXQUFXLFNBQUMsK0JBQStCO2tCQUUzQyxLQUFLO29CQUVMLEtBQUs7MEJBQ0wsTUFBTTtxQkFFTixTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzt3QkE2Rm5DLFlBQVksU0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7OztJQXBHMUMsaUNBQStEOztJQUUvRCwyQkFBcUI7O0lBRXJCLDZCQUF1Qjs7SUFDdkIsbUNBQXFFOztJQUVyRSw4QkFBNEU7Ozs7O0lBRTVFLDJCQUFzQzs7Ozs7SUFFdEMsaUNBQTBCOztJQUUxQix3Q0FBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEhvc3RCaW5kaW5nLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uQ2hhbmdlcyxcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBoZXhUb1JnYiwgcmdiVG9IZXgsIHJnYlRvSHN2LCBoc3ZUb0hleCB9IGZyb20gJy4vY29sb3ItdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWNvbG9yLXBhbGV0dGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxjYW52YXNcbiAgICAgICNjYW52YXNcbiAgICAgIGNsYXNzPVwiY29sb3ItcGFsZXR0ZVwiXG4gICAgICB3aWR0aD1cIjI1MFwiXG4gICAgICBoZWlnaHQ9XCIyNTBcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgPlxuICAgIDwvY2FudmFzPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIENvbG9yUGFsZXR0ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29sb3ItcGFsZXR0ZS1jb250YWluZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGh1ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBjb2xvckNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHtzdGF0aWM6IGZhbHNlfSkgY2FudmFzOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcblxuICBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIHByaXZhdGUgbW91c2Vkb3duID0gZmFsc2U7XG5cbiAgcHVibGljIHNlbGVjdGVkUG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcblxuICBkcmF3KCkge1xuICAgIGlmICghdGhpcy5jdHgpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmhlaWdodDtcblxuICAgIGlmICh0aGlzLmh1ZSkge1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gdGhpcy5odWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICcjZmYwMDAwJztcbiAgICB9XG5cbiAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIGNvbnN0IHdoaXRlR3JhZCA9IHRoaXMuY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIHdpZHRoLCAwKTtcbiAgICB3aGl0ZUdyYWQuYWRkQ29sb3JTdG9wKDAsICdyZ2JhKDI1NSwyNTUsMjU1LDEpJyk7XG4gICAgd2hpdGVHcmFkLmFkZENvbG9yU3RvcCgxLCAncmdiYSgyNTUsMjU1LDI1NSwwKScpO1xuXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gd2hpdGVHcmFkO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY29uc3QgYmxhY2tHcmFkID0gdGhpcy5jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgaGVpZ2h0KTtcbiAgICBibGFja0dyYWQuYWRkQ29sb3JTdG9wKDAsICdyZ2JhKDAsMCwwLDApJyk7XG4gICAgYmxhY2tHcmFkLmFkZENvbG9yU3RvcCgxLCAncmdiYSgwLDAsMCwxKScpO1xuXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gYmxhY2tHcmFkO1xuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQb3NpdGlvbikge1xuICAgICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJ3doaXRlJztcbiAgICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdGhpcy5jdHguYXJjKFxuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24ueCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvc2l0aW9uLnksXG4gICAgICAgIDUsXG4gICAgICAgIDAsXG4gICAgICAgIDIgKiBNYXRoLlBJXG4gICAgICApO1xuICAgICAgdGhpcy5jdHgubGluZVdpZHRoID0gMztcbiAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbG9yICYmICFjaGFuZ2VzLmNvbG9yLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgY29uc3QgcmdiQ29sb3IgPSBoZXhUb1JnYih0aGlzLmNvbG9yKTtcblxuICAgICAgaWYgKHJnYkNvbG9yKSB7XG4gICAgICAgIGNvbnN0IGhzdiA9IHJnYlRvSHN2KHJnYkNvbG9yLnIsIHJnYkNvbG9yLmcsIHJnYkNvbG9yLmIpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogKGhzdi5zICogMjUwKSAvIDEwMCxcbiAgICAgICAgICB5OiAyNTAgLSAoaHN2LnYgKiAyNTApIC8gMTAwXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5odWUgJiYgIWNoYW5nZXMuaHVlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgdGhpcy5kcmF3KCk7XG5cbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc2VsZWN0ZWRQb3NpdGlvbjtcblxuICAgICAgaWYgKHBvcykge1xuICAgICAgICB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQodGhpcy5nZXRDb2xvckF0UG9zaXRpb24ocG9zLngsIHBvcy55KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmNvbG9yKSB7XG4gICAgICBjb25zdCByZ2JDb2xvciA9IGhleFRvUmdiKHRoaXMuY29sb3IpO1xuXG4gICAgICBpZiAocmdiQ29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gcmdiVG9Ic3YocmdiQ29sb3IuciwgcmdiQ29sb3IuZywgcmdiQ29sb3IuYik7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiAoaHN2LnMgKiAyNTApIC8gMTAwLFxuICAgICAgICAgIHk6IDI1MCAtIChoc3YudiAqIDI1MCkgLyAxMDBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VVcChldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlZG93biA9IGZhbHNlO1xuICB9XG5cbiAgb25Nb3VzZURvd24oZXZ0OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5tb3VzZWRvd24gPSB0cnVlO1xuICAgIGNvbnN0IHhQb3MgPSBldnQub2Zmc2V0WCA8IDAgPyAwIDogZXZ0Lm9mZnNldFggPj0gMjUwID8gMjQ5IDogZXZ0Lm9mZnNldFg7XG4gICAgY29uc3QgeVBvcyA9IGV2dC5vZmZzZXRZIDwgMCA/IDAgOiBldnQub2Zmc2V0WSA+PSAyNTAgPyAyNDkgOiBldnQub2Zmc2V0WTtcblxuICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgIHg6IHhQb3MsXG4gICAgICB5OiB5UG9zLFxuICAgIH07XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdGhpcy5lbWl0Q29sb3IoeFBvcywgeVBvcyk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5tb3VzZWRvd24pIHtcbiAgICAgIGNvbnN0IHhQb3MgPSBldnQub2Zmc2V0WCA8IDAgPyAwIDogZXZ0Lm9mZnNldFggPj0gMjUwID8gMjQ5IDogZXZ0Lm9mZnNldFg7XG4gICAgICBjb25zdCB5UG9zID0gZXZ0Lm9mZnNldFkgPCAwID8gMCA6IGV2dC5vZmZzZXRZID49IDI1MCA/IDI0OSA6IGV2dC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHhQb3MsXG4gICAgICAgIHk6IHlQb3MsXG4gICAgICB9O1xuICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB0aGlzLmVtaXRDb2xvcih4UG9zLCB5UG9zKTtcbiAgICB9XG4gIH1cblxuICBlbWl0Q29sb3IoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSB0aGlzLmdldENvbG9yQXRQb3NpdGlvbih4LCB5KTtcbiAgICB0aGlzLmNvbG9yQ2hhbmdlLmVtaXQocmdiYUNvbG9yKTtcbiAgfVxuXG4gIGdldENvbG9yQXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuY3R4LmdldEltYWdlRGF0YSh4LCB5LCAxLCAxKS5kYXRhO1xuICAgIHJldHVybiByZ2JUb0hleChpbWFnZURhdGFbMF0sIGltYWdlRGF0YVsxXSwgaW1hZ2VEYXRhWzJdKTtcbiAgfVxufVxuIl19