├── .gitignore ├── LICENSE ├── README.md ├── _config.yml ├── dist ├── acolorpicker.d.ts └── acolorpicker.js ├── docs ├── docs.js ├── docs.js.map └── index.html ├── package-lock.json ├── package.json ├── screenshots ├── favicon.png ├── favicon.svg ├── logotype.png ├── logotype.svg ├── screenshot.png ├── screenshot_all.png ├── screenshot_alpha.png ├── screenshot_palette.png └── screenshot_palette_editable.png ├── src ├── acolorpicker.css ├── acolorpicker.d.ts ├── acolorpicker.html ├── acolorpicker.js ├── docs │ ├── docs.css │ ├── docs.js │ └── index.html ├── test-ts │ ├── test.ts │ └── tsconfig.json ├── test.html └── utils.js ├── webpack.common.js ├── webpack.dev.js ├── webpack.docs.js └── webpack.prod.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.sublime* 2 | .DS_Store 3 | data/ 4 | node_modules/ 5 | bower_components/ 6 | .jshintrc 7 | .eslintrc* 8 | todo 9 | .vscode/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2018 Gianfranco Caldi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [![npm version](https://badge.fury.io/js/a-color-picker.svg)](https://badge.fury.io/js/a-color-picker) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![live demo](https://img.shields.io/badge/demo-codepen-yellow.svg)](https://codepen.io/narsenico/pen/xPxNeE) [![](https://data.jsdelivr.com/v1/package/npm/a-color-picker/badge)](https://www.jsdelivr.com/package/npm/a-color-picker) 3 | 4 | ![a-color-picker](/screenshots/logotype.png) 5 | 6 | See [api and demo](https://narsenico.github.io/a-color-picker/) 7 | 8 | ![a-color-picker screenshot](/screenshots/screenshot_all.png) 9 | 10 | ## Usage 11 | 1. Include `acolorpicker.js` 12 | ```html 13 | 14 | ``` 15 | or require `a-color-picker` 16 | ```js 17 | const AColorPicker = require('a-color-picker'); 18 | ``` 19 | 2. Call this JavaScript function 20 | ```js 21 | AColorPicker.from('div.container'); 22 | ``` -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /dist/acolorpicker.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'a-color-picker'; 2 | 3 | declare namespace AColorPicker { 4 | 5 | type OutFormat = ( 6 | 'rgb' | 'rgbcss' | 'rgbcss4' | 'rgba' | 'rgbacss' | 7 | 'hsl' | 'hslcss' | 'hslcss4' | 'hsla' | 'hslacss' | 8 | 'hex' | 'hexcss4' | 'int' 9 | ); 10 | 11 | type EventName = ('change' | 'coloradd' | 'colorremove'); 12 | 13 | type ACPCallback = (controller: ACPController, color?: string) => void; 14 | 15 | interface ACPHTMLElement extends HTMLElement { 16 | readonly ctrl: ACPController; 17 | } 18 | 19 | interface ACPColor extends Object { 20 | rgb: Array; 21 | rgbcss: string; 22 | rgbcss4: string; 23 | rgba: Array; 24 | rgbacss: string; 25 | hsl: Array; 26 | hslcss: string; 27 | hslcss4: string; 28 | hsla: Array; 29 | hslacss: string; 30 | hex: string; 31 | hexcss4: string; 32 | int: number; 33 | toString(): string; 34 | } 35 | 36 | interface ACPController extends Object { 37 | readonly element: ACPHTMLElement; 38 | readonly rgbhex: string; 39 | readonly all: ACPColor; 40 | readonly palette: Array; 41 | rgb: Array; 42 | rgba: Array; 43 | hsl: Array; 44 | hsla: Array; 45 | color: string | Array; 46 | /** 47 | * @deprecated use on('change', cb) instead 48 | */ 49 | onchange: ACPCallback; 50 | /** 51 | * @deprecated use on('coloradd', cb) instead 52 | */ 53 | oncoloradd: ACPCallback; 54 | /** 55 | * @deprecated use on('colorremove', cb) instead 56 | */ 57 | oncolorremove: ACPCallback; 58 | on(eventName: EventName, cb: ACPCallback): ACPController; 59 | off(eventName: EventName, cb?: ACPCallback): ACPController; 60 | } 61 | 62 | /** 63 | * @param color {string | Array} color to be parsed 64 | * @param outFormat {string} format 65 | * @returns {string} color formattted 66 | */ 67 | export function parseColor(color: string | Array, outFormat?: OutFormat): string; 68 | /** 69 | * @param color {string | Array} color to be parsed 70 | * @param objToFill {Object} plain object 71 | * @returns {Object} objToFill object filled with properties 72 | */ 73 | export function parseColor(color: string | Array, objToFill: Object): Object & ACPColor; 74 | export function createPicker(options?: Object): ACPController; 75 | export function createPicker(element: any, options?: Object): ACPController; 76 | export function from(selector: any, options?: Object): Array; 77 | } 78 | 79 | export = AColorPicker; -------------------------------------------------------------------------------- /dist/acolorpicker.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * a-color-picker (https://github.com/narsenico/a-color-picker) 3 | * 4 | * Copyright (c) 2017-2018, Gianfranco Caldi. 5 | * Released under the MIT License. 6 | */ 7 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("AColorPicker",[],t):"object"==typeof exports?exports.AColorPicker=t():e.AColorPicker=t()}("undefined"!=typeof self?self:this,function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(i,o,function(t){return e[t]}.bind(null,o));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(e,t,r){"use strict"; 8 | /*! 9 | * is-plain-object 10 | * 11 | * Copyright (c) 2014-2017, Jon Schlinkert. 12 | * Released under the MIT License. 13 | */var i=r(3);function o(e){return!0===i(e)&&"[object Object]"===Object.prototype.toString.call(e)}e.exports=function(e){var t,r;return!1!==o(e)&&"function"==typeof(t=e.constructor)&&!1!==o(r=t.prototype)&&!1!==r.hasOwnProperty("isPrototypeOf")}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VERSION=t.PALETTE_MATERIAL_CHROME=t.PALETTE_MATERIAL_500=t.COLOR_NAMES=t.getLuminance=t.intToRgb=t.rgbToInt=t.rgbToHsv=t.rgbToHsl=t.hslToRgb=t.rgbToHex=t.parseColor=t.parseColorToHsla=t.parseColorToHsl=t.parseColorToRgba=t.parseColorToRgb=t.from=t.createPicker=void 0;var i=function(){function e(e,t){for(var r=0;r-1,p="undefined"!=typeof window&&window.navigator.userAgent.indexOf("rv:")>-1,d={id:null,attachTo:"body",showHSL:!0,showRGB:!0,showHEX:!0,showAlpha:!1,color:"#ff0000",palette:null,paletteEditable:!1,useAlphaInPalette:"auto",slBarSize:[232,150],hueBarSize:[150,11],alphaBarSize:[150,11]},f="COLOR",g="RGBA_USER",b="HSLA_USER";function v(e,t,r){return e?e instanceof HTMLElement?e:e instanceof NodeList?e[0]:"string"==typeof e?document.querySelector(e):e.jquery?e.get(0):r?t:null:t}function m(e){var t=e.getContext("2d"),r=+e.width,i=+e.height,n=t.createLinearGradient(1,1,1,i-1);return n.addColorStop(0,"white"),n.addColorStop(1,"black"),{setHue:function(e){var o=t.createLinearGradient(1,0,r-1,0);o.addColorStop(0,"hsla("+e+", 100%, 50%, 0)"),o.addColorStop(1,"hsla("+e+", 100%, 50%, 1)"),t.fillStyle=n,t.fillRect(0,0,r,i),t.fillStyle=o,t.globalCompositeOperation="multiply",t.fillRect(0,0,r,i),t.globalCompositeOperation="source-over"},grabColor:function(e,r){return t.getImageData(e,r,1,1).data},findColor:function(e,t,n){var a=(0,s.rgbToHsv)(e,t,n),l=o(a,3),c=l[1],h=l[2];return[c*r,i-h*i]}}}function A(e,t,r){return null===e?t:/^\s*$/.test(e)?r:!!/true|yes|1/i.test(e)||!/false|no|0/i.test(e)&&t}function y(e,t,r){if(null===e)return t;if(/^\s*$/.test(e))return r;var i=e.split(",").map(Number);return 2===i.length&&i[0]&&i[1]?i:t}var k=function(){function e(t,r){if(c(this,e),r?(t=v(t),this.options=Object.assign({},d,r)):t&&(0,n.default)(t)?(this.options=Object.assign({},d,t),t=v(this.options.attachTo)):(this.options=Object.assign({},d),t=v((0,s.nvl)(t,this.options.attachTo))),!t)throw new Error("Container not found: "+this.options.attachTo);!function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"acp-";if(t.hasAttribute(r+"show-hsl")&&(e.showHSL=A(t.getAttribute(r+"show-hsl"),d.showHSL,!0)),t.hasAttribute(r+"show-rgb")&&(e.showRGB=A(t.getAttribute(r+"show-rgb"),d.showRGB,!0)),t.hasAttribute(r+"show-hex")&&(e.showHEX=A(t.getAttribute(r+"show-hex"),d.showHEX,!0)),t.hasAttribute(r+"show-alpha")&&(e.showAlpha=A(t.getAttribute(r+"show-alpha"),d.showAlpha,!0)),t.hasAttribute(r+"palette-editable")&&(e.paletteEditable=A(t.getAttribute(r+"palette-editable"),d.paletteEditable,!0)),t.hasAttribute(r+"sl-bar-size")&&(e.slBarSize=y(t.getAttribute(r+"sl-bar-size"),d.slBarSize,[232,150])),t.hasAttribute(r+"hue-bar-size")&&(e.hueBarSize=y(t.getAttribute(r+"hue-bar-size"),d.hueBarSize,[150,11]),e.alphaBarSize=e.hueBarSize),t.hasAttribute(r+"palette")){var i=t.getAttribute(r+"palette");switch(i){case"PALETTE_MATERIAL_500":e.palette=s.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":case"":e.palette=s.PALETTE_MATERIAL_CHROME;break;default:e.palette=i.split(/[;|]/)}}t.hasAttribute(r+"color")&&(e.color=t.getAttribute(r+"color"))}(this.options,t),this.H=0,this.S=0,this.L=0,this.R=0,this.G=0,this.B=0,this.A=1,this.palette={},this.element=document.createElement("div"),this.options.id&&(this.element.id=this.options.id),this.element.className="a-color-picker",this.element.innerHTML=a.default,t.appendChild(this.element);var i=this.element.querySelector(".a-color-picker-h");this.setupHueCanvas(i),this.hueBarHelper=m(i),this.huePointer=this.element.querySelector(".a-color-picker-h+.a-color-picker-dot");var o=this.element.querySelector(".a-color-picker-sl");this.setupSlCanvas(o),this.slBarHelper=m(o),this.slPointer=this.element.querySelector(".a-color-picker-sl+.a-color-picker-dot"),this.preview=this.element.querySelector(".a-color-picker-preview"),this.setupClipboard(this.preview.querySelector(".a-color-picker-clipbaord")),this.options.showHSL?(this.setupInput(this.inputH=this.element.querySelector(".a-color-picker-hsl>input[nameref=H]")),this.setupInput(this.inputS=this.element.querySelector(".a-color-picker-hsl>input[nameref=S]")),this.setupInput(this.inputL=this.element.querySelector(".a-color-picker-hsl>input[nameref=L]"))):this.element.querySelector(".a-color-picker-hsl").remove(),this.options.showRGB?(this.setupInput(this.inputR=this.element.querySelector(".a-color-picker-rgb>input[nameref=R]")),this.setupInput(this.inputG=this.element.querySelector(".a-color-picker-rgb>input[nameref=G]")),this.setupInput(this.inputB=this.element.querySelector(".a-color-picker-rgb>input[nameref=B]"))):this.element.querySelector(".a-color-picker-rgb").remove(),this.options.showHEX?this.setupInput(this.inputRGBHEX=this.element.querySelector("input[nameref=RGBHEX]")):this.element.querySelector(".a-color-picker-rgbhex").remove(),this.options.paletteEditable||this.options.palette&&this.options.palette.length>0?this.setPalette(this.paletteRow=this.element.querySelector(".a-color-picker-palette")):(this.paletteRow=this.element.querySelector(".a-color-picker-palette"),this.paletteRow.remove()),this.options.showAlpha?(this.setupAlphaCanvas(this.element.querySelector(".a-color-picker-a")),this.alphaPointer=this.element.querySelector(".a-color-picker-a+.a-color-picker-dot")):this.element.querySelector(".a-color-picker-alpha").remove(),this.element.style.width=this.options.slBarSize[0]+"px",this.onValueChanged(f,this.options.color)}return i(e,[{key:"setupHueCanvas",value:function(e){var t=this;e.width=this.options.hueBarSize[0],e.height=this.options.hueBarSize[1];for(var r=e.getContext("2d"),i=r.createLinearGradient(0,0,this.options.hueBarSize[0],0),o=0;o<=1;o+=1/360)i.addColorStop(o,"hsl("+360*o+", 100%, 50%)");r.fillStyle=i,r.fillRect(0,0,this.options.hueBarSize[0],this.options.hueBarSize[1]);var n=function(r){var i=(0,s.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.hueBarSize[0]),o=Math.round(360*i/t.options.hueBarSize[0]);t.huePointer.style.left=i-7+"px",t.onValueChanged("H",o)},a=function e(){document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){n(e),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a)})}},{key:"setupSlCanvas",value:function(e){var t=this;e.width=this.options.slBarSize[0],e.height=this.options.slBarSize[1];var r=function(r){var i=(0,s.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.slBarSize[0]-1),o=(0,s.limit)(r.clientY-e.getBoundingClientRect().top,0,t.options.slBarSize[1]-1),n=t.slBarHelper.grabColor(i,o);t.slPointer.style.left=i-7+"px",t.slPointer.style.top=o-7+"px",t.onValueChanged("RGB",n)},i=function e(){document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){r(e),document.addEventListener("mousemove",r),document.addEventListener("mouseup",i)})}},{key:"setupAlphaCanvas",value:function(e){var t=this;e.width=this.options.alphaBarSize[0],e.height=this.options.alphaBarSize[1];var r=e.getContext("2d"),i=r.createLinearGradient(0,0,e.width-1,0);i.addColorStop(0,"hsla(0, 0%, 50%, 0)"),i.addColorStop(1,"hsla(0, 0%, 50%, 1)"),r.fillStyle=i,r.fillRect(0,0,this.options.alphaBarSize[0],this.options.alphaBarSize[1]);var o=function(r){var i=(0,s.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.alphaBarSize[0]),o=+(i/t.options.alphaBarSize[0]).toFixed(2);t.alphaPointer.style.left=i-7+"px",t.onValueChanged("ALPHA",o)},n=function e(){document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){o(e),document.addEventListener("mousemove",o),document.addEventListener("mouseup",n)})}},{key:"setupInput",value:function(e){var t=this,r=+e.min,i=+e.max,o=e.getAttribute("nameref");e.hasAttribute("select-on-focus")&&e.addEventListener("focus",function(){e.select()}),"text"===e.type?e.addEventListener("change",function(){t.onValueChanged(o,e.value)}):((u||p)&&e.addEventListener("keydown",function(n){"Up"===n.key?(e.value=(0,s.limit)(+e.value+1,r,i),t.onValueChanged(o,e.value),n.returnValue=!1):"Down"===n.key&&(e.value=(0,s.limit)(+e.value-1,r,i),t.onValueChanged(o,e.value),n.returnValue=!1)}),e.addEventListener("change",function(){var n=+e.value;t.onValueChanged(o,(0,s.limit)(n,r,i))}))}},{key:"setupClipboard",value:function(e){var t=this;e.title="click to copy",e.addEventListener("click",function(){e.value=(0,s.parseColor)([t.R,t.G,t.B,t.A],"hexcss4"),e.select(),document.execCommand("copy")})}},{key:"setPalette",value:function(e){var t=this,r="auto"===this.options.useAlphaInPalette?this.options.showAlpha:this.options.useAlphaInPalette,i=null;switch(this.options.palette){case"PALETTE_MATERIAL_500":i=s.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":i=s.PALETTE_MATERIAL_CHROME;break;default:i=(0,s.ensureArray)(this.options.palette)}if(this.options.paletteEditable||i.length>0){var o=function(r,i,o){var s=e.querySelector('.a-color-picker-palette-color[data-color="'+r+'"]')||document.createElement("div");s.className="a-color-picker-palette-color",s.style.backgroundColor=r,s.setAttribute("data-color",r),s.title=r,e.insertBefore(s,i),t.palette[r]=!0,o&&t.onPaletteColorAdd(r)},n=function(r,i){r?(e.removeChild(r),t.palette[r.getAttribute("data-color")]=!1,i&&t.onPaletteColorRemove(r.getAttribute("data-color"))):(e.querySelectorAll(".a-color-picker-palette-color[data-color]").forEach(function(t){e.removeChild(t)}),Object.keys(t.palette).forEach(function(e){t.palette[e]=!1}),i&&t.onPaletteColorRemove())};if(i.map(function(e){return(0,s.parseColor)(e,r?"rgbcss4":"hex")}).filter(function(e){return!!e}).forEach(function(e){return o(e)}),this.options.paletteEditable){var a=document.createElement("div");a.className="a-color-picker-palette-color a-color-picker-palette-add",a.innerHTML="+",e.appendChild(a),e.addEventListener("click",function(e){/a-color-picker-palette-add/.test(e.target.className)?e.shiftKey?n(null,!0):o(r?(0,s.parseColor)([t.R,t.G,t.B,t.A],"rgbcss4"):(0,s.rgbToHex)(t.R,t.G,t.B),e.target,!0):/a-color-picker-palette-color/.test(e.target.className)&&(e.shiftKey?n(e.target,!0):t.onValueChanged(f,e.target.getAttribute("data-color")))})}else e.addEventListener("click",function(e){/a-color-picker-palette-color/.test(e.target.className)&&t.onValueChanged(f,e.target.getAttribute("data-color"))})}else e.style.display="none"}},{key:"updatePalette",value:function(e){this.paletteRow.innerHTML="",this.palette={},this.paletteRow.parentElement||this.element.appendChild(this.paletteRow),this.options.palette=e,this.setPalette(this.paletteRow)}},{key:"onValueChanged",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{silent:!1};switch(e){case"H":this.H=t;var i=(0,s.hslToRgb)(this.H,this.S,this.L),n=o(i,3);this.R=n[0],this.G=n[1],this.B=n[2],this.slBarHelper.setHue(t),this.updatePointerH(this.H),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"S":this.S=t;var a=(0,s.hslToRgb)(this.H,this.S,this.L),l=o(a,3);this.R=l[0],this.G=l[1],this.B=l[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"L":this.L=t;var c=(0,s.hslToRgb)(this.H,this.S,this.L),h=o(c,3);this.R=h[0],this.G=h[1],this.B=h[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"R":this.R=t;var u=(0,s.rgbToHsl)(this.R,this.G,this.B),p=o(u,3);this.H=p[0],this.S=p[1],this.L=p[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"G":this.G=t;var d=(0,s.rgbToHsl)(this.R,this.G,this.B),v=o(d,3);this.H=v[0],this.S=v[1],this.L=v[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"B":this.B=t;var m=(0,s.rgbToHsl)(this.R,this.G,this.B),A=o(m,3);this.H=A[0],this.S=A[1],this.L=A[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case"RGB":var y=o(t,3);this.R=y[0],this.G=y[1],this.B=y[2];var k=(0,s.rgbToHsl)(this.R,this.G,this.B),F=o(k,3);this.H=F[0],this.S=F[1],this.L=F[2],this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A);break;case g:var E=o(t,4);this.R=E[0],this.G=E[1],this.B=E[2],this.A=E[3];var B=(0,s.rgbToHsl)(this.R,this.G,this.B),H=o(B,3);this.H=H[0],this.S=H[1],this.L=H[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A),this.updatePointerA(this.A);break;case b:var R=o(t,4);this.H=R[0],this.S=R[1],this.L=R[2],this.A=R[3];var C=(0,s.hslToRgb)(this.H,this.S,this.L),S=o(C,3);this.R=S[0],this.G=S[1],this.B=S[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A),this.updatePointerA(this.A);break;case"RGBHEX":var L=(0,s.cssColorToRgba)(t)||[this.R,this.G,this.B,this.A],w=o(L,4);this.R=w[0],this.G=w[1],this.B=w[2],this.A=w[3];var T=(0,s.rgbToHsl)(this.R,this.G,this.B),x=o(T,3);this.H=x[0],this.S=x[1],this.L=x[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updatePointerA(this.A);break;case f:var G=(0,s.parseColor)(t,"rgba")||[0,0,0,1],I=o(G,4);this.R=I[0],this.G=I[1],this.B=I[2],this.A=I[3];var P=(0,s.rgbToHsl)(this.R,this.G,this.B),D=o(P,3);this.H=D[0],this.S=D[1],this.L=D[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B,this.A),this.updatePointerA(this.A);break;case"ALPHA":this.A=t,this.updateInputRGBHEX(this.R,this.G,this.B,this.A)}1===this.A?this.preview.style.backgroundColor="rgb("+this.R+","+this.G+","+this.B+")":this.preview.style.backgroundColor="rgba("+this.R+","+this.G+","+this.B+","+this.A+")",r&&r.silent||this.onchange&&this.onchange(this.preview.style.backgroundColor)}},{key:"onPaletteColorAdd",value:function(e){this.oncoloradd&&this.oncoloradd(e)}},{key:"onPaletteColorRemove",value:function(e){this.oncolorremove&&this.oncolorremove(e)}},{key:"updateInputHSL",value:function(e,t,r){this.options.showHSL&&(this.inputH.value=e,this.inputS.value=t,this.inputL.value=r)}},{key:"updateInputRGB",value:function(e,t,r){this.options.showRGB&&(this.inputR.value=e,this.inputG.value=t,this.inputB.value=r)}},{key:"updateInputRGBHEX",value:function(e,t,r,i){this.options.showHEX&&(this.options.showAlpha?this.inputRGBHEX.value=(0,s.parseColor)([e,t,r,i],"hexcss4"):this.inputRGBHEX.value=(0,s.rgbToHex)(e,t,r))}},{key:"updatePointerH",value:function(e){var t=this.options.hueBarSize[0]*e/360;this.huePointer.style.left=t-7+"px"}},{key:"updatePointerSL",value:function(e,t,r){var i=(0,s.hslToRgb)(e,t,r),n=o(i,3),a=n[0],l=n[1],c=n[2],h=this.slBarHelper.findColor(a,l,c),u=o(h,2),p=u[0],d=u[1];p>=0&&(this.slPointer.style.left=p-7+"px",this.slPointer.style.top=d-7+"px")}},{key:"updatePointerA",value:function(e){if(this.options.showAlpha){var t=this.options.alphaBarSize[0]*e;this.alphaPointer.style.left=t-7+"px"}}}]),e}(),F=function(){function e(t){c(this,e),this.name=t,this.listeners=[]}return i(e,[{key:"on",value:function(e){e&&this.listeners.push(e)}},{key:"off",value:function(e){this.listeners=e?this.listeners.filter(function(t){return t!==e}):[]}},{key:"emit",value:function(e,t){for(var r=this.listeners.slice(0),i=0;i1&&void 0!==arguments[1]&&arguments[1];r.onValueChanged(f,e,{silent:t})},get all(){if(n){var e=[r.R,r.G,r.B,r.A],t=r.A<1?"rgba("+r.R+","+r.G+","+r.B+","+r.A+")":s.rgbToHex.apply(void 0,e);(a=(0,s.parseColor)(e,a)).toString=function(){return t},n=!1}return Object.assign({},a)},get onchange(){return i.change&&i.change.listeners[0]},set onchange(e){this.off("change").on("change",e)},get oncoloradd(){return i.coloradd&&i.coloradd.listeners[0]},set oncoloradd(e){this.off("coloradd").on("coloradd",e)},get oncolorremove(){return i.colorremove&&i.colorremove.listeners[0]},set oncolorremove(e){this.off("colorremove").on("colorremove",e)},get palette(){return Object.keys(r.palette).filter(function(e){return r.palette[e]})},set palette(e){r.updatePalette(e)},show:function(){r.element.classList.remove("hidden")},hide:function(){r.element.classList.add("hidden")},toggle:function(){r.element.classList.toggle("hidden")},on:function(e,t){return e&&i[e]&&i[e].on(t),this},off:function(e,t){return e&&i[e]&&i[e].off(t),this},destroy:function(){i.change.off(),i.coloradd.off(),i.colorremove.off(),r.element.remove(),i=null,r=null}};return r.onchange=function(){for(var e=arguments.length,t=Array(e),r=0;rstyle[data-source="a-color-picker"]')){var B=r(5).toString(),H=document.createElement("style");H.setAttribute("type","text/css"),H.setAttribute("data-source","a-color-picker"),H.innerHTML=B,document.querySelector("head").appendChild(H)}t.createPicker=E,t.from=function(e,t){var r=function(e){return e?Array.isArray(e)?e:e instanceof HTMLElement?[e]:e instanceof NodeList?[].concat(h(e)):"string"==typeof e?[].concat(h(document.querySelectorAll(e))):e.jquery?e.get():[]:[]}(e).map(function(e,r){var i=E(e,t);return i.index=r,i});return r.on=function(e,t){return r.forEach(function(r){return r.on(e,t)}),this},r.off=function(e){return r.forEach(function(t){return t.off(e)}),this},r},t.parseColorToRgb=s.parseColorToRgb,t.parseColorToRgba=s.parseColorToRgba,t.parseColorToHsl=s.parseColorToHsl,t.parseColorToHsla=s.parseColorToHsla,t.parseColor=s.parseColor,t.rgbToHex=s.rgbToHex,t.hslToRgb=s.hslToRgb,t.rgbToHsl=s.rgbToHsl,t.rgbToHsv=s.rgbToHsv,t.rgbToInt=s.rgbToInt,t.intToRgb=s.intToRgb,t.getLuminance=s.getLuminance,t.COLOR_NAMES=s.COLOR_NAMES,t.PALETTE_MATERIAL_500=s.PALETTE_MATERIAL_500,t.PALETTE_MATERIAL_CHROME=s.PALETTE_MATERIAL_CHROME,t.VERSION="1.2.2"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.nvl=t.ensureArray=t.limit=t.getLuminance=t.parseColor=t.parseColorToHsla=t.parseColorToHsl=t.cssHslaToHsla=t.cssHslToHsl=t.parseColorToRgba=t.parseColorToRgb=t.cssRgbaToRgba=t.cssRgbToRgb=t.cssColorToRgba=t.cssColorToRgb=t.intToRgb=t.rgbToInt=t.rgbToHsv=t.rgbToHsl=t.hslToRgb=t.rgbToHex=t.PALETTE_MATERIAL_CHROME=t.PALETTE_MATERIAL_500=t.COLOR_NAMES=void 0;var i=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],i=!0,o=!1,s=void 0;try{for(var n,a=e[Symbol.iterator]();!(i=(n=a.next()).done)&&(r.push(n.value),!t||r.length!==t);i=!0);}catch(e){o=!0,s=e}finally{try{!i&&a.return&&a.return()}finally{if(o)throw s}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},o=function(e){return e&&e.__esModule?e:{default:e}}(r(0));function s(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);tr?r:e}function l(e,t){return null==e?t:e}function c(e,t,r){var i=[a(e,0,255),a(t,0,255),a(r,0,255)];return"#"+("000000"+((e=i[0])<<16|(t=i[1])<<8|(r=i[2])).toString(16)).slice(-6)}function h(e,t,r){var i=void 0,o=void 0,s=void 0,n=[a(e,0,360)/360,a(t,0,100)/100,a(r,0,100)/100];if(e=n[0],r=n[2],0==(t=n[1]))i=o=s=r;else{var l=function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e},c=r<.5?r*(1+t):r+t-r*t,h=2*r-c;i=l(h,c,e+1/3),o=l(h,c,e),s=l(h,c,e-1/3)}return[255*i,255*o,255*s].map(Math.round)}function u(e,t,r){var i=[a(e,0,255)/255,a(t,0,255)/255,a(r,0,255)/255];e=i[0],t=i[1],r=i[2];var o=Math.max(e,t,r),s=Math.min(e,t,r),n=void 0,l=void 0,c=(o+s)/2;if(o==s)n=l=0;else{var h=o-s;switch(l=c>.5?h/(2-o-s):h/(o+s),o){case e:n=(t-r)/h+(t>16&255,e>>8&255,255&e]},t.cssColorToRgb=d,t.cssColorToRgba=f,t.cssRgbToRgb=g,t.cssRgbaToRgba=b,t.parseColorToRgb=function(e){return Array.isArray(e)?e=[a(e[0],0,255),a(e[1],0,255),a(e[2],0,255)]:d(e)||g(e)},t.parseColorToRgba=v,t.cssHslToHsl=m,t.cssHslaToHsla=A,t.parseColorToHsl=function(e){return Array.isArray(e)?e=[a(e[0],0,360),a(e[1],0,100),a(e[2],0,100)]:m(e)},t.parseColorToHsla=y,t.parseColor=function(e,t){if(t=t||"rgb",null!=e){var r=void 0;if((r=v(e))||(r=y(e))&&(r=[].concat(s(h.apply(void 0,s(r))),[r[3]])))return(0,o.default)(t)?["rgb","rgbcss","rgbcss4","rgba","rgbacss","hsl","hslcss","hslcss4","hsla","hslacss","hex","hexcss4","int"].reduce(function(e,t){return e[t]=k(r,t),e},t||{}):k(r,t.toString().toLowerCase())}},t.getLuminance=function(e,t,r){return.2126*(e=(e/=255)<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=(t/=255)<.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*((r/=255)<.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},t.limit=a,t.ensureArray=function(e){return e?Array.from(e):[]},t.nvl=l},function(e,t,r){"use strict"; 21 | /*! 22 | * isobject 23 | * 24 | * Copyright (c) 2014-2017, Jon Schlinkert. 25 | * Released under the MIT License. 26 | */e.exports=function(e){return null!=e&&"object"==typeof e&&!1===Array.isArray(e)}},function(e,t){e.exports='
'},function(e,t,r){var i=r(6);e.exports="string"==typeof i?i:i.toString()},function(e,t,r){(e.exports=r(7)(!1)).push([e.i,"/*!\n * a-color-picker\n * https://github.com/narsenico/a-color-picker\n *\n * Copyright (c) 2017-2018, Gianfranco Caldi.\n * Released under the MIT License.\n */.a-color-picker{background-color:#fff;padding:0;display:inline-flex;flex-direction:column;user-select:none;width:232px;font:400 10px Helvetica,Arial,sans-serif;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.05),0 2px 4px rgba(0,0,0,.25)}.a-color-picker,.a-color-picker-row,.a-color-picker input{box-sizing:border-box}.a-color-picker-row{padding:15px;display:flex;flex-direction:row;align-items:center;justify-content:space-between;user-select:none}.a-color-picker-row-top{padding:0}.a-color-picker-row:not(:first-child){border-top:1px solid #f5f5f5}.a-color-picker-column{display:flex;flex-direction:column}.a-color-picker-cell{flex:1 1 auto;margin-bottom:4px}.a-color-picker-cell:last-child{margin-bottom:0}.a-color-picker-stack{position:relative}.a-color-picker-dot{position:absolute;width:14px;height:14px;top:0;left:0;background:#fff;pointer-events:none;border-radius:50px;z-index:1000;box-shadow:0 1px 2px rgba(0,0,0,.75)}.a-color-picker-a,.a-color-picker-h,.a-color-picker-sl{cursor:cell}.a-color-picker-a+.a-color-picker-dot,.a-color-picker-h+.a-color-picker-dot{top:-2px}.a-color-picker-a,.a-color-picker-h{border-radius:2px}.a-color-picker-preview{box-sizing:border-box;width:30px;height:30px;user-select:none;border-radius:15px}.a-color-picker-circle{border-radius:50px;border:1px solid #eee}.a-color-picker-hsl,.a-color-picker-rgb,.a-color-picker-single-input{justify-content:space-evenly}.a-color-picker-hsl>label,.a-color-picker-rgb>label,.a-color-picker-single-input>label{padding:0 8px;flex:0 0 auto;color:#969696}.a-color-picker-hsl>input,.a-color-picker-rgb>input,.a-color-picker-single-input>input{text-align:center;padding:2px 0;width:0;flex:1 1 auto;border:1px solid #e0e0e0;line-height:20px}.a-color-picker-hsl>input::-webkit-inner-spin-button,.a-color-picker-rgb>input::-webkit-inner-spin-button,.a-color-picker-single-input>input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.a-color-picker-hsl>input:focus,.a-color-picker-rgb>input:focus,.a-color-picker-single-input>input:focus{border-color:#04a9f4;outline:none}.a-color-picker-transparent{background-image:linear-gradient(-45deg,#cdcdcd 25%,transparent 0),linear-gradient(45deg,#cdcdcd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#cdcdcd 0),linear-gradient(45deg,transparent 75%,#cdcdcd 0);background-size:11px 11px;background-position:0 0,0 -5.5px,-5.5px 5.5px,5.5px 0}.a-color-picker-sl{border-radius:3px 3px 0 0}.a-color-picker.hide-alpha [show-on-alpha],.a-color-picker.hide-hsl [show-on-hsl],.a-color-picker.hide-rgb [show-on-rgb],.a-color-picker.hide-single-input [show-on-single-input]{display:none}.a-color-picker-clipbaord{width:100%;height:100%;opacity:0;cursor:pointer}.a-color-picker-palette{flex-flow:wrap;flex-direction:row;justify-content:flex-start;padding:10px}.a-color-picker-palette-color{width:15px;height:15px;flex:0 1 15px;margin:3px;box-sizing:border-box;cursor:pointer;border-radius:3px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}.a-color-picker-palette-add{text-align:center;line-height:13px;color:#607d8b}.a-color-picker.hidden{display:none}",""])},function(e,t){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var r=function(e,t){var r=e[1]||"",i=e[3];if(!i)return r;if(t&&"function"==typeof btoa){var o=function(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}(i),s=i.sources.map(function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"});return[r].concat(s).concat([o]).join("\n")}return[r].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r}).join("")},t.i=function(e,r){"string"==typeof e&&(e=[[null,e,""]]);for(var i={},o=0;o 4 | * 5 | * Copyright (c) 2014-2017, Jon Schlinkert. 6 | * Released under the MIT License. 7 | */var o=r(11);function n(e){return!0===o(e)&&"[object Object]"===Object.prototype.toString.call(e)}e.exports=function(e){var t,r;return!1!==n(e)&&("function"==typeof(t=e.constructor)&&(!1!==n(r=t.prototype)&&!1!==r.hasOwnProperty("isPrototypeOf")))}},function(e,t,r){"use strict";r(3);var o=r(9),n=document.querySelector(".title");o.from(".picker").on("change",function(e,t){console.log(t),n.style.backgroundColor=t,o.getLuminance.apply(o,function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);th1{padding:8px 4px;margin:0;letter-spacing:.1em;font-size:3em;color:var(--color-light)}.title>h1.logo{padding:4px 0 11px 38px}.avatar{border-radius:4px;vertical-align:text-top;object-fit:cover;width:100%;max-height:6.6em;opacity:.3;filter:grayscale(100%);-webkit-filter:grayscale(100%)}.badges{padding:4px}.badges a{text-decoration:none}.content>nav a{color:var(--color-light)}.content>nav>ul{position:sticky;position:-webkit-sticky;top:0;list-style:none;padding:0}.content>nav>ul>li:before{content:"> ";color:#dedede}.content>nav>ul>li>ul{font-size:.8em;top:0;list-style:none;padding:0 0 0 .8em}.content>.pens>section{background-color:#fafafa;margin:16px 8px;padding:8px 24px;border-radius:2px}.content>.pens>section>h3:before{content:"> ";color:#dedede}table.detail{width:100%;border-collapse:collapse}table.detail th{font-size:.85em;text-align:left;padding-top:16px}table.detail td{vertical-align:top;border-bottom:1px solid #ededed;max-width:14em;padding:4px 0}table.detail tbody,table.detail tbody>tr{transition:background-color .4s ease}table.detail.hover-on-body tbody:hover,table.detail.hover-on-row tbody>tr:hover{background-color:#efefef}@media (min-width:68em){html{font-size:18px}}@media (max-height:400px){.content>nav>ul{position:relative}}.theme-gray{--color-light:#697b82}.theme-gray body{background-color:#f5f5f5}.theme-gray .avatar{opacity:.6}',""])},function(e,t){e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t){e.exports="\"data:image/svg+xml,%3C!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E %3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E %3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='1000px' height='1000px' viewBox='0 0 1000 1000' enable-background='new 0 0 1000 1000' xml:space='preserve'%3E %3Cg%3E %3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='100' y1='274.7212' x2='900' y2='274.7212'%3E %3Cstop offset='0' style='stop-color:%23ED1C24'/%3E %3Cstop offset='0.0028' style='stop-color:%23EE2423'/%3E %3Cstop offset='0.0226' style='stop-color:%23F25520'/%3E %3Cstop offset='0.0429' style='stop-color:%23F67F1D'/%3E %3Cstop offset='0.0635' style='stop-color:%23F9A11B'/%3E %3Cstop offset='0.0842' style='stop-color:%23FCBC19'/%3E %3Cstop offset='0.1053' style='stop-color:%23FECF18'/%3E %3Cstop offset='0.127' style='stop-color:%23FFDA17'/%3E %3Cstop offset='0.15' style='stop-color:%23FFDE17'/%3E %3Cstop offset='0.3' style='stop-color:%23F26522'/%3E %3Cstop offset='0.47' style='stop-color:%2300A14B'/%3E %3Cstop offset='0.64' style='stop-color:%2300AEEF'/%3E %3Cstop offset='0.8012' style='stop-color:%232E3192'/%3E %3Cstop offset='1' style='stop-color:%23EC008C'/%3E %3C/linearGradient%3E %3Cpath fill='url(%23SVGID_1_)' d='M900,449.444V215.606c0-63.849-51.756-115.608-115.604-115.608H215.61 c-63.851,0-115.61,51.76-115.61,115.608v233.838H900z'/%3E %3ClinearGradient id='SVGID_2_' gradientUnits='userSpaceOnUse' x1='100' y1='725.2764' x2='900' y2='725.2764'%3E %3Cstop offset='0' style='stop-color:%23A7A9AC'/%3E %3Cstop offset='0.0732' style='stop-color:%23ADAFB2'/%3E %3Cstop offset='0.2797' style='stop-color:%23B8BABC'/%3E %3Cstop offset='0.5' style='stop-color:%23BCBEC0'/%3E %3Cstop offset='1' style='stop-color:%23414042'/%3E %3C/linearGradient%3E %3Cpath fill='url(%23SVGID_2_)' d='M100,550.551v233.836c0,63.844,51.759,115.615,115.61,115.615h568.786 C848.244,900.002,900,848.23,900,784.387V550.551H100z'/%3E %3Cpath fill='%23FFFFFF' d='M756.787,499.999c0,141.822-114.969,256.779-256.781,256.779c-141.83,0-256.792-114.957-256.792-256.779 c0-141.818,114.962-256.783,256.792-256.783C641.818,243.216,756.787,358.181,756.787,499.999z'/%3E %3Cpath fill='%2338A9D6' d='M732.328,499.998c0,128.309-104.019,232.32-232.322,232.32c-128.318,0-232.33-104.012-232.33-232.32 c0-128.31,104.012-232.324,232.33-232.324C628.31,267.674,732.328,371.688,732.328,499.998z'/%3E %3C/g%3E %3C/svg%3E\""},function(e,t,r){var o,n,i={},s=(o=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===n&&(n=o.apply(this,arguments)),n}),a=function(e){var t={};return function(e){if("function"==typeof e)return e();if(void 0===t[e]){var r=function(e){return document.querySelector(e)}.call(this,e);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[e]=r}return t[e]}}(),l=null,c=0,p=[],u=r(8);function h(e,t){for(var r=0;r=0&&p.splice(t,1)}function b(e){var t=document.createElement("style");return void 0===e.attrs.type&&(e.attrs.type="text/css"),v(t,e.attrs),f(e,t),t}function v(e,t){Object.keys(t).forEach(function(r){e.setAttribute(r,t[r])})}function m(e,t){var r,o,n,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var s=c++;r=l||(l=b(t)),o=A.bind(null,r,s,!1),n=A.bind(null,r,s,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(r=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",v(t,e.attrs),f(e,t),t}(t),o=function(e,t,r){var o=r.css,n=r.sourceMap,i=void 0===t.convertToAbsoluteUrls&&n;(t.convertToAbsoluteUrls||i)&&(o=u(o));n&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */");var s=new Blob([o],{type:"text/css"}),a=e.href;e.href=URL.createObjectURL(s),a&&URL.revokeObjectURL(a)}.bind(null,r,t),n=function(){g(r),r.href&&URL.revokeObjectURL(r.href)}):(r=b(t),o=function(e,t){var r=t.css,o=t.media;o&&e.setAttribute("media",o);if(e.styleSheet)e.styleSheet.cssText=r;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(r))}}.bind(null,r),n=function(){g(r)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else n()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=s()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var r=d(e,t);return h(r,t),function(e){for(var o=[],n=0;n-1,h="undefined"!=typeof window&&window.navigator.userAgent.indexOf("rv:")>-1,d={id:null,attachTo:"body",showHSL:!0,showRGB:!0,showHEX:!0,showAlpha:!1,color:"#ff0000",palette:null,paletteEditable:!1,useAlphaInPalette:"auto",slBarSize:[232,150],hueBarSize:[150,11],alphaBarSize:[150,11]},f="COLOR",g="RGBA_USER",b="HSLA_USER";function v(e,t,r){return e?e instanceof HTMLElement?e:e instanceof NodeList?e[0]:"string"==typeof e?document.querySelector(e):e.jquery?e.get(0):r?t:null:t}function m(e){var t=e.getContext("2d"),r=+e.width,o=+e.height,s=t.createLinearGradient(1,1,1,o-1);return s.addColorStop(0,"white"),s.addColorStop(1,"black"),{setHue:function(e){var n=t.createLinearGradient(1,0,r-1,0);n.addColorStop(0,"hsla("+e+", 100%, 50%, 0)"),n.addColorStop(1,"hsla("+e+", 100%, 50%, 1)"),t.fillStyle=s,t.fillRect(0,0,r,o),t.fillStyle=n,t.globalCompositeOperation="multiply",t.fillRect(0,0,r,o),t.globalCompositeOperation="source-over"},grabColor:function(e,r){return t.getImageData(e,r,1,1).data},findColor:function(e,t,s){var a=(0,i.rgbToHsv)(e,t,s),l=n(a,3),c=l[1],p=l[2];return[c*r,o-p*o]}}}function y(e,t,r){return null===e?t:/^\s*$/.test(e)?r:!!/true|yes|1/i.test(e)||!/false|no|0/i.test(e)&&t}function x(e,t,r){if(null===e)return t;if(/^\s*$/.test(e))return r;var o=e.split(",").map(Number);return 2===o.length&&o[0]&&o[1]?o:t}var A=function(){function e(t,r){if(c(this,e),r?(t=v(t),this.options=Object.assign({},d,r)):t&&(0,s.default)(t)?(this.options=Object.assign({},d,t),t=v(this.options.attachTo)):(this.options=Object.assign({},d),t=v((0,i.nvl)(t,this.options.attachTo))),!t)throw new Error("Container not found: "+this.options.attachTo);!function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"acp-";if(t.hasAttribute(r+"show-hsl")&&(e.showHSL=y(t.getAttribute(r+"show-hsl"),d.showHSL,!0)),t.hasAttribute(r+"show-rgb")&&(e.showRGB=y(t.getAttribute(r+"show-rgb"),d.showRGB,!0)),t.hasAttribute(r+"show-hex")&&(e.showHEX=y(t.getAttribute(r+"show-hex"),d.showHEX,!0)),t.hasAttribute(r+"show-alpha")&&(e.showAlpha=y(t.getAttribute(r+"show-alpha"),d.showAlpha,!0)),t.hasAttribute(r+"palette-editable")&&(e.paletteEditable=y(t.getAttribute(r+"palette-editable"),d.paletteEditable,!0)),t.hasAttribute(r+"sl-bar-size")&&(e.slBarSize=x(t.getAttribute(r+"sl-bar-size"),d.slBarSize,[232,150])),t.hasAttribute(r+"hue-bar-size")&&(e.hueBarSize=x(t.getAttribute(r+"hue-bar-size"),d.hueBarSize,[150,11]),e.alphaBarSize=e.hueBarSize),t.hasAttribute(r+"palette")){var o=t.getAttribute(r+"palette");switch(o){case"PALETTE_MATERIAL_500":e.palette=i.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":case"":e.palette=i.PALETTE_MATERIAL_CHROME;break;default:e.palette=o.split(/[;|]/)}}t.hasAttribute(r+"color")&&(e.color=t.getAttribute(r+"color"))}(this.options,t),this.H=0,this.S=0,this.L=0,this.R=0,this.G=0,this.B=0,this.A=1,this.palette={},this.element=document.createElement("div"),this.options.id&&(this.element.id=this.options.id),this.element.className="a-color-picker",this.element.innerHTML=a.default,t.appendChild(this.element);var o=this.element.querySelector(".a-color-picker-h");this.setupHueCanvas(o),this.hueBarHelper=m(o),this.huePointer=this.element.querySelector(".a-color-picker-h+.a-color-picker-dot");var n=this.element.querySelector(".a-color-picker-sl");this.setupSlCanvas(n),this.slBarHelper=m(n),this.slPointer=this.element.querySelector(".a-color-picker-sl+.a-color-picker-dot"),this.preview=this.element.querySelector(".a-color-picker-preview"),this.setupClipboard(this.preview.querySelector(".a-color-picker-clipbaord")),this.options.showHSL?(this.setupInput(this.inputH=this.element.querySelector(".a-color-picker-hsl>input[nameref=H]")),this.setupInput(this.inputS=this.element.querySelector(".a-color-picker-hsl>input[nameref=S]")),this.setupInput(this.inputL=this.element.querySelector(".a-color-picker-hsl>input[nameref=L]"))):this.element.querySelector(".a-color-picker-hsl").remove(),this.options.showRGB?(this.setupInput(this.inputR=this.element.querySelector(".a-color-picker-rgb>input[nameref=R]")),this.setupInput(this.inputG=this.element.querySelector(".a-color-picker-rgb>input[nameref=G]")),this.setupInput(this.inputB=this.element.querySelector(".a-color-picker-rgb>input[nameref=B]"))):this.element.querySelector(".a-color-picker-rgb").remove(),this.options.showHEX?this.setupInput(this.inputRGBHEX=this.element.querySelector("input[nameref=RGBHEX]")):this.element.querySelector(".a-color-picker-rgbhex").remove(),this.options.paletteEditable||this.options.palette&&this.options.palette.length>0?this.setPalette(this.paletteRow=this.element.querySelector(".a-color-picker-palette")):(this.paletteRow=this.element.querySelector(".a-color-picker-palette"),this.paletteRow.remove()),this.options.showAlpha?(this.setupAlphaCanvas(this.element.querySelector(".a-color-picker-a")),this.alphaPointer=this.element.querySelector(".a-color-picker-a+.a-color-picker-dot")):this.element.querySelector(".a-color-picker-alpha").remove(),this.element.style.width=this.options.slBarSize[0]+"px",this.onValueChanged(f,this.options.color)}return o(e,[{key:"setupHueCanvas",value:function(e){var t=this;e.width=this.options.hueBarSize[0],e.height=this.options.hueBarSize[1];for(var r=e.getContext("2d"),o=r.createLinearGradient(0,0,this.options.hueBarSize[0],0),n=0;n<=1;n+=1/360)o.addColorStop(n,"hsl("+360*n+", 100%, 50%)");r.fillStyle=o,r.fillRect(0,0,this.options.hueBarSize[0],this.options.hueBarSize[1]);var s=function(r){var o=(0,i.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.hueBarSize[0]),n=Math.round(360*o/t.options.hueBarSize[0]);t.huePointer.style.left=o-7+"px",t.onValueChanged("H",n)},a=function e(){document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){s(e),document.addEventListener("mousemove",s),document.addEventListener("mouseup",a)})}},{key:"setupSlCanvas",value:function(e){var t=this;e.width=this.options.slBarSize[0],e.height=this.options.slBarSize[1];var r=function(r){var o=(0,i.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.slBarSize[0]-1),n=(0,i.limit)(r.clientY-e.getBoundingClientRect().top,0,t.options.slBarSize[1]-1),s=t.slBarHelper.grabColor(o,n);t.slPointer.style.left=o-7+"px",t.slPointer.style.top=n-7+"px",t.onValueChanged("RGB",s)},o=function e(){document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){r(e),document.addEventListener("mousemove",r),document.addEventListener("mouseup",o)})}},{key:"setupAlphaCanvas",value:function(e){var t=this;e.width=this.options.alphaBarSize[0],e.height=this.options.alphaBarSize[1];var r=e.getContext("2d"),o=r.createLinearGradient(0,0,e.width-1,0);o.addColorStop(0,"hsla(0, 0%, 50%, 0)"),o.addColorStop(1,"hsla(0, 0%, 50%, 1)"),r.fillStyle=o,r.fillRect(0,0,this.options.alphaBarSize[0],this.options.alphaBarSize[1]);var n=function(r){var o=(0,i.limit)(r.clientX-e.getBoundingClientRect().left,0,t.options.alphaBarSize[0]),n=+(o/t.options.alphaBarSize[0]).toFixed(2);t.alphaPointer.style.left=o-7+"px",t.onValueChanged("ALPHA",n)},s=function e(){document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",e)};e.addEventListener("mousedown",function(e){n(e),document.addEventListener("mousemove",n),document.addEventListener("mouseup",s)})}},{key:"setupInput",value:function(e){var t=this,r=+e.min,o=+e.max,n=e.getAttribute("nameref");e.hasAttribute("select-on-focus")&&e.addEventListener("focus",function(){e.select()}),"text"===e.type?e.addEventListener("change",function(){t.onValueChanged(n,e.value)}):((u||h)&&e.addEventListener("keydown",function(s){"Up"===s.key?(e.value=(0,i.limit)(+e.value+1,r,o),t.onValueChanged(n,e.value),s.returnValue=!1):"Down"===s.key&&(e.value=(0,i.limit)(+e.value-1,r,o),t.onValueChanged(n,e.value),s.returnValue=!1)}),e.addEventListener("change",function(){var s=+e.value;t.onValueChanged(n,(0,i.limit)(s,r,o))}))}},{key:"setupClipboard",value:function(e){var t=this;e.title="click to copy",e.addEventListener("click",function(){e.value=(0,i.parseColor)([t.R,t.G,t.B,t.A],"hexcss4"),e.select(),document.execCommand("copy")})}},{key:"setPalette",value:function(e){var t=this,r="auto"===this.options.useAlphaInPalette?this.options.showAlpha:this.options.useAlphaInPalette,o=null;switch(this.options.palette){case"PALETTE_MATERIAL_500":o=i.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":o=i.PALETTE_MATERIAL_CHROME;break;default:o=(0,i.ensureArray)(this.options.palette)}if(this.options.paletteEditable||o.length>0){var n=function(r,o,n){var i=e.querySelector('.a-color-picker-palette-color[data-color="'+r+'"]')||document.createElement("div");i.className="a-color-picker-palette-color",i.style.backgroundColor=r,i.setAttribute("data-color",r),i.title=r,e.insertBefore(i,o),t.palette[r]=!0,n&&t.onPaletteColorAdd(r)},s=function(r,o){r?(e.removeChild(r),t.palette[r.getAttribute("data-color")]=!1,o&&t.onPaletteColorRemove(r.getAttribute("data-color"))):(e.querySelectorAll(".a-color-picker-palette-color[data-color]").forEach(function(t){e.removeChild(t)}),Object.keys(t.palette).forEach(function(e){t.palette[e]=!1}),o&&t.onPaletteColorRemove())};if(o.map(function(e){return(0,i.parseColor)(e,r?"rgbcss4":"hex")}).filter(function(e){return!!e}).forEach(function(e){return n(e)}),this.options.paletteEditable){var a=document.createElement("div");a.className="a-color-picker-palette-color a-color-picker-palette-add",a.innerHTML="+",e.appendChild(a),e.addEventListener("click",function(e){/a-color-picker-palette-add/.test(e.target.className)?e.shiftKey?s(null,!0):n(r?(0,i.parseColor)([t.R,t.G,t.B,t.A],"rgbcss4"):(0,i.rgbToHex)(t.R,t.G,t.B),e.target,!0):/a-color-picker-palette-color/.test(e.target.className)&&(e.shiftKey?s(e.target,!0):t.onValueChanged(f,e.target.getAttribute("data-color")))})}else e.addEventListener("click",function(e){/a-color-picker-palette-color/.test(e.target.className)&&t.onValueChanged(f,e.target.getAttribute("data-color"))})}else e.style.display="none"}},{key:"updatePalette",value:function(e){this.paletteRow.innerHTML="",this.palette={},this.paletteRow.parentElement||this.element.appendChild(this.paletteRow),this.options.palette=e,this.setPalette(this.paletteRow)}},{key:"onValueChanged",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{silent:!1};switch(e){case"H":this.H=t;var o=(0,i.hslToRgb)(this.H,this.S,this.L),s=n(o,3);this.R=s[0],this.G=s[1],this.B=s[2],this.slBarHelper.setHue(t),this.updatePointerH(this.H),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"S":this.S=t;var a=(0,i.hslToRgb)(this.H,this.S,this.L),l=n(a,3);this.R=l[0],this.G=l[1],this.B=l[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"L":this.L=t;var c=(0,i.hslToRgb)(this.H,this.S,this.L),p=n(c,3);this.R=p[0],this.G=p[1],this.B=p[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"R":this.R=t;var u=(0,i.rgbToHsl)(this.R,this.G,this.B),h=n(u,3);this.H=h[0],this.S=h[1],this.L=h[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"G":this.G=t;var d=(0,i.rgbToHsl)(this.R,this.G,this.B),v=n(d,3);this.H=v[0],this.S=v[1],this.L=v[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"B":this.B=t;var m=(0,i.rgbToHsl)(this.R,this.G,this.B),y=n(m,3);this.H=y[0],this.S=y[1],this.L=y[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"RGB":var x=n(t,3);this.R=x[0],this.G=x[1],this.B=x[2];var A=(0,i.rgbToHsl)(this.R,this.G,this.B),E=n(A,3);this.H=E[0],this.S=E[1],this.L=E[2],this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case g:var k=n(t,4);this.R=k[0],this.G=k[1],this.B=k[2],this.A=k[3];var F=(0,i.rgbToHsl)(this.R,this.G,this.B),C=n(F,3);this.H=C[0],this.S=C[1],this.L=C[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case b:var w=n(t,4);this.H=w[0],this.S=w[1],this.L=w[2],this.A=w[3];var B=(0,i.hslToRgb)(this.H,this.S,this.L),H=n(B,3);this.R=H[0],this.G=H[1],this.B=H[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case"RGBHEX":var R=(0,i.cssColorToRgb)(t)||[this.R,this.G,this.B],S=n(R,3);this.R=S[0],this.G=S[1],this.B=S[2];var L=(0,i.rgbToHsl)(this.R,this.G,this.B),T=n(L,3);this.H=T[0],this.S=T[1],this.L=T[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B);break;case f:var G=(0,i.parseColor)(t,"rgba")||[0,0,0,1],I=n(G,4);this.R=I[0],this.G=I[1],this.B=I[2],this.A=I[3];var D=(0,i.rgbToHsl)(this.R,this.G,this.B),P=n(D,3);this.H=P[0],this.S=P[1],this.L=P[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case"ALPHA":this.A=t}1===this.A?this.preview.style.backgroundColor="rgb("+this.R+","+this.G+","+this.B+")":this.preview.style.backgroundColor="rgba("+this.R+","+this.G+","+this.B+","+this.A+")",r&&r.silent||this.onchange&&this.onchange(this.preview.style.backgroundColor)}},{key:"onPaletteColorAdd",value:function(e){this.oncoloradd&&this.oncoloradd(e)}},{key:"onPaletteColorRemove",value:function(e){this.oncolorremove&&this.oncolorremove(e)}},{key:"updateInputHSL",value:function(e,t,r){this.options.showHSL&&(this.inputH.value=e,this.inputS.value=t,this.inputL.value=r)}},{key:"updateInputRGB",value:function(e,t,r){this.options.showRGB&&(this.inputR.value=e,this.inputG.value=t,this.inputB.value=r)}},{key:"updateInputRGBHEX",value:function(e,t,r){this.options.showHEX&&(this.inputRGBHEX.value=(0,i.rgbToHex)(e,t,r))}},{key:"updatePointerH",value:function(e){var t=this.options.hueBarSize[0]*e/360;this.huePointer.style.left=t-7+"px"}},{key:"updatePointerSL",value:function(e,t,r){var o=(0,i.hslToRgb)(e,t,r),s=n(o,3),a=s[0],l=s[1],c=s[2],p=this.slBarHelper.findColor(a,l,c),u=n(p,2),h=u[0],d=u[1];h>=0&&(this.slPointer.style.left=h-7+"px",this.slPointer.style.top=d-7+"px")}},{key:"updatePointerA",value:function(e){if(this.options.showAlpha){var t=this.options.alphaBarSize[0]*e;this.alphaPointer.style.left=t-7+"px"}}}]),e}(),E=function(){function e(t){c(this,e),this.name=t,this.listeners=[]}return o(e,[{key:"on",value:function(e){e&&this.listeners.push(e)}},{key:"off",value:function(e){this.listeners=e?this.listeners.filter(function(t){return t!==e}):[]}},{key:"emit",value:function(e,t){for(var r=this.listeners.slice(0),o=0;o1&&void 0!==arguments[1]&&arguments[1];r.onValueChanged(f,e,{silent:t})},get all(){if(s){var e=[r.R,r.G,r.B,r.A],t=r.A<1?"rgba("+r.R+","+r.G+","+r.B+","+r.A+")":i.rgbToHex.apply(void 0,e);(a=(0,i.parseColor)(e,a)).toString=function(){return t},s=!1}return Object.assign({},a)},get onchange(){return o.change&&o.change.listeners[0]},set onchange(e){this.off("change").on("change",e)},get oncoloradd(){return o.coloradd&&o.coloradd.listeners[0]},set oncoloradd(e){this.off("coloradd").on("coloradd",e)},get oncolorremove(){return o.colorremove&&o.colorremove.listeners[0]},set oncolorremove(e){this.off("colorremove").on("colorremove",e)},get palette(){return Object.keys(r.palette).filter(function(e){return r.palette[e]})},set palette(e){r.updatePalette(e)},show:function(){r.element.classList.remove("hidden")},hide:function(){r.element.classList.add("hidden")},toggle:function(){r.element.classList.toggle("hidden")},on:function(e,t){return e&&o[e]&&o[e].on(t),this},off:function(e,t){return e&&o[e]&&o[e].off(t),this},destroy:function(){o.change.off(),o.coloradd.off(),o.colorremove.off(),r.element.remove(),o=null,r=null}};return r.onchange=function(){for(var e=arguments.length,t=Array(e),r=0;rstyle[data-source="a-color-picker"]')){var F=r(13).toString(),C=document.createElement("style");C.setAttribute("type","text/css"),C.setAttribute("data-source","a-color-picker"),C.innerHTML=F,document.querySelector("head").appendChild(C)}t.createPicker=k,t.from=function(e,t){var r=function(e){return e?Array.isArray(e)?e:e instanceof HTMLElement?[e]:e instanceof NodeList?[].concat(p(e)):"string"==typeof e?[].concat(p(document.querySelectorAll(e))):e.jquery?e.get():[]:[]}(e).map(function(e,r){var o=k(e,t);return o.index=r,o});return r.on=function(e,t){return r.forEach(function(r){return r.on(e,t)}),this},r.off=function(e){return r.forEach(function(t){return t.off(e)}),this},r},t.parseColorToRgb=i.parseColorToRgb,t.parseColorToRgba=i.parseColorToRgba,t.parseColorToHsl=i.parseColorToHsl,t.parseColorToHsla=i.parseColorToHsla,t.parseColor=i.parseColor,t.rgbToHex=i.rgbToHex,t.hslToRgb=i.hslToRgb,t.rgbToHsl=i.rgbToHsl,t.rgbToHsv=i.rgbToHsv,t.rgbToInt=i.rgbToInt,t.intToRgb=i.intToRgb,t.getLuminance=i.getLuminance,t.COLOR_NAMES=i.COLOR_NAMES,t.PALETTE_MATERIAL_500=i.PALETTE_MATERIAL_500,t.PALETTE_MATERIAL_CHROME=i.PALETTE_MATERIAL_CHROME,t.VERSION="1.2.1"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.nvl=t.ensureArray=t.limit=t.getLuminance=t.parseColor=t.parseColorToHsla=t.parseColorToHsl=t.cssHslaToHsla=t.cssHslToHsl=t.parseColorToRgba=t.parseColorToRgb=t.cssRgbaToRgba=t.cssRgbToRgb=t.cssColorToRgba=t.cssColorToRgb=t.intToRgb=t.rgbToInt=t.rgbToHsv=t.rgbToHsl=t.hslToRgb=t.rgbToHex=t.PALETTE_MATERIAL_CHROME=t.PALETTE_MATERIAL_500=t.COLOR_NAMES=void 0;var o,n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],o=!0,n=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(o=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);o=!0);}catch(e){n=!0,i=e}finally{try{!o&&a.return&&a.return()}finally{if(n)throw i}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=r(1),s=(o=i)&&o.__esModule?o:{default:o};function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);tr?r:e}function p(e,t){return null==e?t:e}function u(e,t,r){var o=[c(e,0,255),c(t,0,255),c(r,0,255)];return"#"+("000000"+((e=o[0])<<16|(t=o[1])<<8|(r=o[2])).toString(16)).slice(-6)}function h(e,t,r){var o=void 0,n=void 0,i=void 0,s=[c(e,0,360)/360,c(t,0,100)/100,c(r,0,100)/100];if(e=s[0],r=s[2],0==(t=s[1]))o=n=i=r;else{var a=function(e,t,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e},l=r<.5?r*(1+t):r+t-r*t,p=2*r-l;o=a(p,l,e+1/3),n=a(p,l,e),i=a(p,l,e-1/3)}return[255*o,255*n,255*i].map(Math.round)}function d(e,t,r){var o=[c(e,0,255)/255,c(t,0,255)/255,c(r,0,255)/255];e=o[0],t=o[1],r=o[2];var n=Math.max(e,t,r),i=Math.min(e,t,r),s=void 0,a=void 0,l=(n+i)/2;if(n==i)s=a=0;else{var p=n-i;switch(a=l>.5?p/(2-n-i):p/(n+i),n){case e:s=(t-r)/p+(t>16&255,e>>8&255,255&e]},t.cssColorToRgb=g,t.cssColorToRgba=b,t.cssRgbToRgb=v,t.cssRgbaToRgba=m,t.parseColorToRgb=function(e){return Array.isArray(e)?e=[c(e[0],0,255),c(e[1],0,255),c(e[2],0,255)]:g(e)||v(e)},t.parseColorToRgba=y,t.cssHslToHsl=x,t.cssHslaToHsla=A,t.parseColorToHsl=function(e){return Array.isArray(e)?e=[c(e[0],0,360),c(e[1],0,100),c(e[2],0,100)]:x(e)},t.parseColorToHsla=E,t.parseColor=function(e,t){if(t=t||"rgb",null!=e){var r=void 0;if((r=y(e))||(r=E(e))&&(r=[].concat(a(h.apply(void 0,a(r))),[r[3]])))return(0,s.default)(t)?["rgb","rgbcss","rgbcss4","rgba","rgbacss","hsl","hslcss","hslcss4","hsla","hslacss","hex","hexcss4","int"].reduce(function(e,t){return e[t]=k(r,t),e},t||{}):k(r,t.toString().toLowerCase())}},t.getLuminance=function(e,t,r){return.2126*(e=(e/=255)<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=(t/=255)<.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(r=(r/=255)<.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},t.limit=c,t.ensureArray=function(e){return e?Array.from(e):[]},t.nvl=p},function(e,t,r){"use strict"; 15 | /*! 16 | * isobject 17 | * 18 | * Copyright (c) 2014-2017, Jon Schlinkert. 19 | * Released under the MIT License. 20 | */e.exports=function(e){return null!=e&&"object"==typeof e&&!1===Array.isArray(e)}},function(e,t){e.exports='
'},function(e,t,r){var o=r(14);e.exports="string"==typeof o?o:o.toString()},function(e,t,r){(e.exports=r(0)(!1)).push([e.i,"/*!\n * a-color-picker\n * https://github.com/narsenico/a-color-picker\n *\n * Copyright (c) 2017-2018, Gianfranco Caldi.\n * Released under the MIT License.\n */\n\n.a-color-picker {\n background-color: #FFFFFF;\n padding: 0px;\n box-sizing: border-box;\n display: inline-flex;\n flex-direction: column;\n user-select: none;\n width: 232px;\n font: 400 10px Helvetica,Arial,sans-serif;\n border-radius: 3px;\n box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.05), 0px 2px 4px rgba(0,0,0,0.25);\n}\n\n.a-color-picker input {\n box-sizing: border-box;\n}\n\n.a-color-picker-row {\n padding: 15px;\n box-sizing: border-box;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n user-select: none;\n}\n\n.a-color-picker-row-top {\n padding: 0;\n}\n\n.a-color-picker-row:not(:first-child) {\n border-top: solid 1px #F5F5F5;\n}\n\n.a-color-picker-column {\n display: flex;\n flex-direction: column;\n}\n\n.a-color-picker-cell {\n flex: 1 1 auto;\n margin-bottom: 4px;\n}\n\n.a-color-picker-cell:last-child {\n margin-bottom: 0;\n}\n\n.a-color-picker-stack {\n position: relative;\n}\n\n.a-color-picker-dot {\n position: absolute;\n width: 14px;\n height: 14px;\n top: 0px;\n left: 0px;\n background: #ffffff;\n pointer-events: none;\n border-radius: 50px;\n z-index: 1000;\n box-shadow: 0px 1px 2px rgba(0,0,0,0.75);\n}\n\n.a-color-picker-a, .a-color-picker-h, .a-color-picker-sl {\n cursor: cell;\n}\n\n.a-color-picker-h+.a-color-picker-dot,\n.a-color-picker-a+.a-color-picker-dot {\n top: -2px;\n}\n\n.a-color-picker-h,\n.a-color-picker-a {\n border-radius: 2px;\n}\n\n.a-color-picker-preview {\n box-sizing: border-box;\n width: 30px;\n height: 30px;\n user-select: none;\n border-radius: 15px;\n}\n\n.a-color-picker-circle {\n border-radius: 50px;\n border: solid 1px #eee;\n}\n\n.a-color-picker-hsl,\n.a-color-picker-rgb,\n.a-color-picker-single-input {\n justify-content: space-evenly;\n}\n\n.a-color-picker-hsl>label,\n.a-color-picker-rgb>label,\n.a-color-picker-single-input>label {\n padding: 0 8px;\n flex: 0 0 auto;\n color: #969696;\n}\n\n.a-color-picker-hsl>input,\n.a-color-picker-rgb>input,\n.a-color-picker-single-input>input {\n text-align: center;\n padding: 2px 0px;\n width: 0;\n flex: 1 1 auto;\n border: 1px solid #e0e0e0;\n line-height: 20px;\n}\n\n.a-color-picker-hsl>input::-webkit-inner-spin-button,\n.a-color-picker-rgb>input::-webkit-inner-spin-button,\n.a-color-picker-single-input>input::-webkit-inner-spin-button,\n.a-color-picker-hsl>input::-webkit-inner-spin-button,\n.a-color-picker-rgb>input::-webkit-inner-spin-button,\n.a-color-picker-single-input>input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.a-color-picker-hsl>input:focus,\n.a-color-picker-rgb>input:focus,\n.a-color-picker-single-input>input:focus {\n border-color: #04a9f4;\n outline: none;\n}\n\n.a-color-picker-transparent {\n background-image: linear-gradient(-45deg, #cdcdcd 25%, transparent 25%), linear-gradient(45deg, #cdcdcd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #cdcdcd 75%), linear-gradient(45deg, transparent 75%, #cdcdcd 75%);\n background-size: 11px 11px;\n background-position: 0 0, 0 -5.5px, -5.5px 5.5px, 5.5px 0px;\n\n}\n\n.a-color-picker-sl {\n border-radius: 3px 3px 0px 0px;\n}\n\n.a-color-picker.hide-hsl [show-on-hsl],\n.a-color-picker.hide-rgb [show-on-rgb],\n.a-color-picker.hide-single-input [show-on-single-input],\n.a-color-picker.hide-alpha [show-on-alpha] {\n display: none;\n}\n\n.a-color-picker-clipbaord {\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n}\n\n.a-color-picker-palette {\n flex-flow: wrap;\n flex-direction: row;\n justify-content: flex-start;\n padding: 10px;\n}\n\n.a-color-picker-palette-color {\n width: 15px;\n height: 15px;\n flex: 0 1 15px;\n margin: 3px;\n box-sizing: border-box;\n cursor: pointer;\n border-radius: 3px;\n box-shadow: 0px 0px 0px 1px inset rgba(0,0,0,0.10);\n}\n\n.a-color-picker-palette-add {\n text-align: center;\n line-height: 13px;\n color: #607D8B;\n}\n\n.a-color-picker.hidden {\n display: none;\n}",""])}]); 21 | //# sourceMappingURL=docs.js.map -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | a-color-picker

a-color-picker | for web app

Install

  • npm install a-color-picker --save
  • bower install a-color-picker --save
  • a-color-picker is available on jsdelivr

Create a picker

Define an HTML element to contain the picker and use AColorPicker.from(selector) to create it.
The default picker is created with HSL, RGB and HEX controls.
The acp-color attribute is used to set the initial value.

See the Pen WJoQBm by Caldi Gianfranco ( @narsenico) on CodePen.

Choose which controls to show

Show or hide controls through attributes.
acp-show-* attributes accepts yes/no/true/false values. Attributes without value are considered true.

See the Pen a-color-picker demo attr by Caldi Gianfranco ( @narsenico) on CodePen.

Palette

Show a palette of colors using the acp-palette attribute.
Set a list of colors - named color, hex rgb, rgb(), rgba(), hsl(), hsla() - pipe separated or a predefined palette (PALETTE_MATERIAL_500, PALETTE_MATERIAL_CHROME).
The acp-palette-editable attribute can be set to allow the user to change the palette.

See the Pen a-color-picker demo palette editable by Narsenico ( @narsenico) on CodePen.

Events

To attach an event use on method and off to detach it.

AColorPicker.from(selector)
 2 |     .on(eventName, callback)
 3 |     .off(eventName, callback)
Event name Callback parameters
change picker target
color selected color
coloradd picker target
color color added
colorremove picker target
color color removed or null if all colors are removed

Tips

  • Click on the preview circle to copy current color
  • Shift-click on a palette color to remove it
  • Shift-click the '+' button to remove all the palette colors

API

AColorPicker.createPicker(element, options)
AColorPicker.createPicker(options)

Create a color picker.

Parameter
element HTMLElement, jQuery object or css selector string.
Optional: if not defined, options.attachTo is used.
options See options
Optional only if element is defined.
Return
A ACPController instance
AColorPicker.from(selector, options)

Create one or more color pickers.

Parameter
selector HTMLElement, NodeList, jQuery object or css selector string.
options Optional, see options
Return
An array of ACPController. This array has helper methods on and off to attach/detach events to all items.
AColorPicker.parseColor(color, outFormat)

Parse color in input and return formatted value.

Parameter
color Value to be parsed
Accepts color name, rgb array, hex rgb, rgb(), rgba(), hsl(), hsla()
outFormat Output format, one of: rgb, rgbcss, rgbcss4, rgba, rgbacss, hsl, hslcss, hslcss4, hsla, hslacss, hex, hexcss4.
If outFormat is a plain object, will be filled with all formats as properties.
Return
Formatted color or undefined if not recognized.
AColorPicker.parseColor("red");           // return [255, 0, 0]
 4 | AColorPicker.parseColor("red", "rgb");    // return [255, 0, 0]
 5 | AColorPicker.parseColor("red", "rgbcss"); // return "rgb(255, 0, 0)"
 6 | AColorPicker.parseColor("red", "rgbcss4");// return "rgb(255, 0, 0, 1)"
 7 | AColorPicker.parseColor("red", "rgba");   // return [255, 0, 0, 1]
 8 | AColorPicker.parseColor("red", "rgbacss");// return "rgba(255, 0, 0, 1)"
 9 | AColorPicker.parseColor("red", "hsl");    // return [0,100,50]
10 | AColorPicker.parseColor("red", "hslcss"); // return "hsl(0, 100, 50)"
11 | AColorPicker.parseColor("red", "hslcss4");// return "hsl(0, 100, 50, 1)"
12 | AColorPicker.parseColor("red", "hsla");   // return [0, 100, 50, 1]
13 | AColorPicker.parseColor("red", "hslacss");// return "hsla(0, 100, 50, 1)"
14 | AColorPicker.parseColor("red", "hex");    // return "#ff0000"
15 | AColorPicker.parseColor("red", "hexcss4");// return "#ff0000ff"
16 | AColorPicker.parseColor("red", { });// return { "rgb":[255,0,0], ... }
17 | 
ACPController

Can access picker properties and handle events.

Property Type
color Get or set the current color String|Array Accept: named color, hex rgb, rgb(), rgba(), hsl(), hsla()
Return: hex rgb or rgba() if alpha != 1
// set
18 | picker.color = [205, 220, 57];            // [R, G, B]
19 | picker.color = [205, 220, 57, .5];        // [R, G, B, A]
20 | picker.color = "yellow";                  // named color
21 | picker.color = "#ffdd00";                 // hex rgb
22 | picker.color = "#ffdd00ff";               // hex rgba
23 | picker.color = "#fd0";                    // short hex rgb
24 | picker.color = "#fd0f";                   // short hex rgba
25 | picker.color = "rgb(205, 220, 57)";       // rgb() notation
26 | picker.color = "rgb(205, 220, 57, .5)";   // rgb() notation + alpha (css level 4)
27 | picker.color = "rgba(205, 220, 57, .5)";  // rgba() notation
28 | picker.color = "hsl(120, 100, 125)";      // hsl() notation
29 | picker.color = "hsl(120, 100, 125, .5)";  // hsl() notation + alpha (css level 4)
30 | picker.color = "hsla(120, 100, 125, .5)"; // hsla() notation
31 | // get
32 | picker.color; // return "#ffdd00"
33 | picker.color; // return "rgba(205, 220, 57, .5)" if alpha is != 1
34 | // formatting color (see parseColor for detail)
35 | AColorPicker.parseColor(picker.color, "hsl"); // return "hsl(120, 100, 125)"
36 | 							
palette Get or set the current palette Array Array of colors
// set
37 | picker.palette = ['red', '#00ff00', 'rgb(0, 0, 255)']; // array of color
38 | // get
39 | picker.palette; // return ["#ff0000","#00ff00","#0000ff"]
Function Parameters
on Attach an event to the controller. eventName See events for detail
callback
picker.on("change", (picker, color) => { });
off Detach an event from the controller. eventName See events for detail
picker.off("change");
show Show the picker.
picker.show();
hide Hide the picker.
picker.hide();
toggle Show or hide the picker.
picker.toggle();
setColor Set current color color Same of 'color' property
silent If true the change event will not be triggered
picker.setColor("red", true); // change event not triggered
40 | picker.setColor("red", false); // change event triggered
41 | picker.setColor("red"); // change event triggered
options

Property Type Default
attachTo Where to attach the picker top element, can be HTMLElement, jQuery object or css selector String|Object body
showHSL If falsy hide the HSL inputs Boolean true
showRGB If falsy hide the RGB inputs Boolean true
showHEX If falsy hide the RGB HEX inputs Boolean true
showAlpha If truly show control to change opacity Boolean false
color Initial color Boolean #ff0000
palette Array of predefined colors.
Each element can be color name, rgb array, hex rgb, rgb(), rgba(), hsl(), hsla()
Array null
paletteEditable If truly make the palette editable Boolean false
useAlphaInPalette If truly enable alpha channel in palette colors,
if 'auto' depends on the value of 'showAlpha'
String|Boolean auto
hueBarSize Size of hue bar in pixel (width, height) Array [150,11]
slBarSize Size of saturation/luminance canvas in pixel (width, height) Array [232,150]
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "a-color-picker", 3 | "version": "1.2.2", 4 | "description": "a color pikcer for web app", 5 | "main": "./dist/acolorpicker.js", 6 | "types": "./dist/acolorpicker.d.ts", 7 | "scripts": { 8 | "build": "webpack --config webpack.prod.js", 9 | "build:dev": "webpack --display-used-exports --display-reasons --config webpack.dev.js", 10 | "build:docs": "webpack --config webpack.docs.js", 11 | "start:docs": "webpack-dev-server --open --open-page index.html --port 3000 --config webpack.docs.js", 12 | "test": "webpack-dev-server --open --open-page test.html --port 3000 --config webpack.dev.js" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/narsenico/a-color-picker.git" 17 | }, 18 | "keywords": [ 19 | "javascript", 20 | "color", 21 | "picker", 22 | "color-picker" 23 | ], 24 | "author": "narsenico", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/narsenico/a-color-picker/issues" 28 | }, 29 | "homepage": "https://narsenico.github.io/a-color-picker/", 30 | "devDependencies": { 31 | "babel-core": "^6.26.3", 32 | "babel-loader": "^7.1.5", 33 | "babel-preset-env": "^1.7.0", 34 | "clean-webpack-plugin": "^0.1.19", 35 | "copy-webpack-plugin": "^4.6.0", 36 | "css-loader": "^0.28.11", 37 | "file-loader": "^1.1.11", 38 | "html-loader": "^0.5.5", 39 | "html-webpack-plugin": "^3.2.0", 40 | "style-loader": "^0.21.0", 41 | "svg-url-loader": "^2.3.2", 42 | "text-loader": "0.0.1", 43 | "to-string-loader": "^1.1.5", 44 | "uglifyjs-webpack-plugin": "^1.3.0", 45 | "url-loader": "^1.1.2", 46 | "webpack": "^4.33.0", 47 | "webpack-cli": "^3.3.3", 48 | "webpack-dev-server": "^3.7.1", 49 | "webpack-merge": "^4.2.1" 50 | }, 51 | "dependencies": { 52 | "is-plain-object": "^2.0.4" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /screenshots/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/favicon.png -------------------------------------------------------------------------------- /screenshots/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 36 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /screenshots/logotype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/logotype.png -------------------------------------------------------------------------------- /screenshots/logotype.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 35 | 36 | 37 | 38 | 39 | 40 | 47 | 50 | 57 | 63 | 66 | 72 | 77 | 80 | 87 | 93 | 100 | 108 | 117 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /screenshots/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/screenshot.png -------------------------------------------------------------------------------- /screenshots/screenshot_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/screenshot_all.png -------------------------------------------------------------------------------- /screenshots/screenshot_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/screenshot_alpha.png -------------------------------------------------------------------------------- /screenshots/screenshot_palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/screenshot_palette.png -------------------------------------------------------------------------------- /screenshots/screenshot_palette_editable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narsenico/a-color-picker/76973d09b4a98f1bc21d38fb41260f5a20ec80c0/screenshots/screenshot_palette_editable.png -------------------------------------------------------------------------------- /src/acolorpicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * a-color-picker 3 | * https://github.com/narsenico/a-color-picker 4 | * 5 | * Copyright (c) 2017-2018, Gianfranco Caldi. 6 | * Released under the MIT License. 7 | */ 8 | 9 | .a-color-picker { 10 | background-color: #FFFFFF; 11 | padding: 0px; 12 | box-sizing: border-box; 13 | display: inline-flex; 14 | flex-direction: column; 15 | user-select: none; 16 | width: 232px; 17 | font: 400 10px Helvetica,Arial,sans-serif; 18 | border-radius: 3px; 19 | box-shadow: 0px 0px 0px 1px rgba(0,0,0,0.05), 0px 2px 4px rgba(0,0,0,0.25); 20 | } 21 | 22 | .a-color-picker input { 23 | box-sizing: border-box; 24 | } 25 | 26 | .a-color-picker-row { 27 | padding: 15px; 28 | box-sizing: border-box; 29 | display: flex; 30 | flex-direction: row; 31 | align-items: center; 32 | justify-content: space-between; 33 | user-select: none; 34 | } 35 | 36 | .a-color-picker-row-top { 37 | padding: 0; 38 | } 39 | 40 | .a-color-picker-row:not(:first-child) { 41 | border-top: solid 1px #F5F5F5; 42 | } 43 | 44 | .a-color-picker-column { 45 | display: flex; 46 | flex-direction: column; 47 | } 48 | 49 | .a-color-picker-cell { 50 | flex: 1 1 auto; 51 | margin-bottom: 4px; 52 | } 53 | 54 | .a-color-picker-cell:last-child { 55 | margin-bottom: 0; 56 | } 57 | 58 | .a-color-picker-stack { 59 | position: relative; 60 | } 61 | 62 | .a-color-picker-dot { 63 | position: absolute; 64 | width: 14px; 65 | height: 14px; 66 | top: 0px; 67 | left: 0px; 68 | background: #ffffff; 69 | pointer-events: none; 70 | border-radius: 50px; 71 | z-index: 1000; 72 | box-shadow: 0px 1px 2px rgba(0,0,0,0.75); 73 | } 74 | 75 | .a-color-picker-a, .a-color-picker-h, .a-color-picker-sl { 76 | cursor: cell; 77 | } 78 | 79 | .a-color-picker-h+.a-color-picker-dot, 80 | .a-color-picker-a+.a-color-picker-dot { 81 | top: -2px; 82 | } 83 | 84 | .a-color-picker-h, 85 | .a-color-picker-a { 86 | border-radius: 2px; 87 | } 88 | 89 | .a-color-picker-preview { 90 | box-sizing: border-box; 91 | width: 30px; 92 | height: 30px; 93 | user-select: none; 94 | border-radius: 15px; 95 | } 96 | 97 | .a-color-picker-circle { 98 | border-radius: 50px; 99 | border: solid 1px #eee; 100 | } 101 | 102 | .a-color-picker-hsl, 103 | .a-color-picker-rgb, 104 | .a-color-picker-single-input { 105 | justify-content: space-evenly; 106 | } 107 | 108 | .a-color-picker-hsl>label, 109 | .a-color-picker-rgb>label, 110 | .a-color-picker-single-input>label { 111 | padding: 0 8px; 112 | flex: 0 0 auto; 113 | color: #969696; 114 | } 115 | 116 | .a-color-picker-hsl>input, 117 | .a-color-picker-rgb>input, 118 | .a-color-picker-single-input>input { 119 | text-align: center; 120 | padding: 2px 0px; 121 | width: 0; 122 | flex: 1 1 auto; 123 | border: 1px solid #e0e0e0; 124 | line-height: 20px; 125 | } 126 | 127 | .a-color-picker-hsl>input::-webkit-inner-spin-button, 128 | .a-color-picker-rgb>input::-webkit-inner-spin-button, 129 | .a-color-picker-single-input>input::-webkit-inner-spin-button, 130 | .a-color-picker-hsl>input::-webkit-inner-spin-button, 131 | .a-color-picker-rgb>input::-webkit-inner-spin-button, 132 | .a-color-picker-single-input>input::-webkit-inner-spin-button { 133 | -webkit-appearance: none; 134 | margin: 0; 135 | } 136 | 137 | .a-color-picker-hsl>input:focus, 138 | .a-color-picker-rgb>input:focus, 139 | .a-color-picker-single-input>input:focus { 140 | border-color: #04a9f4; 141 | outline: none; 142 | } 143 | 144 | .a-color-picker-transparent { 145 | background-image: linear-gradient(-45deg, #cdcdcd 25%, transparent 25%), linear-gradient(45deg, #cdcdcd 25%, transparent 25%), linear-gradient(-45deg, transparent 75%, #cdcdcd 75%), linear-gradient(45deg, transparent 75%, #cdcdcd 75%); 146 | background-size: 11px 11px; 147 | background-position: 0 0, 0 -5.5px, -5.5px 5.5px, 5.5px 0px; 148 | 149 | } 150 | 151 | .a-color-picker-sl { 152 | border-radius: 3px 3px 0px 0px; 153 | } 154 | 155 | .a-color-picker.hide-hsl [show-on-hsl], 156 | .a-color-picker.hide-rgb [show-on-rgb], 157 | .a-color-picker.hide-single-input [show-on-single-input], 158 | .a-color-picker.hide-alpha [show-on-alpha] { 159 | display: none; 160 | } 161 | 162 | .a-color-picker-clipbaord { 163 | width: 100%; 164 | height: 100%; 165 | opacity: 0; 166 | cursor: pointer; 167 | } 168 | 169 | .a-color-picker-palette { 170 | flex-flow: wrap; 171 | flex-direction: row; 172 | justify-content: flex-start; 173 | padding: 10px; 174 | } 175 | 176 | .a-color-picker-palette-color { 177 | width: 15px; 178 | height: 15px; 179 | flex: 0 1 15px; 180 | margin: 3px; 181 | box-sizing: border-box; 182 | cursor: pointer; 183 | border-radius: 3px; 184 | box-shadow: 0px 0px 0px 1px inset rgba(0,0,0,0.10); 185 | } 186 | 187 | .a-color-picker-palette-add { 188 | text-align: center; 189 | line-height: 13px; 190 | color: #607D8B; 191 | } 192 | 193 | .a-color-picker.hidden { 194 | display: none; 195 | } -------------------------------------------------------------------------------- /src/acolorpicker.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'a-color-picker'; 2 | 3 | declare namespace AColorPicker { 4 | 5 | type OutFormat = ( 6 | 'rgb' | 'rgbcss' | 'rgbcss4' | 'rgba' | 'rgbacss' | 7 | 'hsl' | 'hslcss' | 'hslcss4' | 'hsla' | 'hslacss' | 8 | 'hex' | 'hexcss4' | 'int' 9 | ); 10 | 11 | type EventName = ('change' | 'coloradd' | 'colorremove'); 12 | 13 | type ACPCallback = (controller: ACPController, color?: string) => void; 14 | 15 | interface ACPHTMLElement extends HTMLElement { 16 | readonly ctrl: ACPController; 17 | } 18 | 19 | interface ACPColor extends Object { 20 | rgb: Array; 21 | rgbcss: string; 22 | rgbcss4: string; 23 | rgba: Array; 24 | rgbacss: string; 25 | hsl: Array; 26 | hslcss: string; 27 | hslcss4: string; 28 | hsla: Array; 29 | hslacss: string; 30 | hex: string; 31 | hexcss4: string; 32 | int: number; 33 | toString(): string; 34 | } 35 | 36 | interface ACPController extends Object { 37 | readonly element: ACPHTMLElement; 38 | readonly rgbhex: string; 39 | readonly all: ACPColor; 40 | readonly palette: Array; 41 | rgb: Array; 42 | rgba: Array; 43 | hsl: Array; 44 | hsla: Array; 45 | color: string | Array; 46 | /** 47 | * @deprecated use on('change', cb) instead 48 | */ 49 | onchange: ACPCallback; 50 | /** 51 | * @deprecated use on('coloradd', cb) instead 52 | */ 53 | oncoloradd: ACPCallback; 54 | /** 55 | * @deprecated use on('colorremove', cb) instead 56 | */ 57 | oncolorremove: ACPCallback; 58 | on(eventName: EventName, cb: ACPCallback): ACPController; 59 | off(eventName: EventName, cb?: ACPCallback): ACPController; 60 | } 61 | 62 | /** 63 | * @param color {string | Array} color to be parsed 64 | * @param outFormat {string} format 65 | * @returns {string} color formattted 66 | */ 67 | export function parseColor(color: string | Array, outFormat?: OutFormat): string; 68 | /** 69 | * @param color {string | Array} color to be parsed 70 | * @param objToFill {Object} plain object 71 | * @returns {Object} objToFill object filled with properties 72 | */ 73 | export function parseColor(color: string | Array, objToFill: Object): Object & ACPColor; 74 | export function createPicker(options?: Object): ACPController; 75 | export function createPicker(element: any, options?: Object): ACPController; 76 | export function from(selector: any, options?: Object): Array; 77 | } 78 | 79 | export = AColorPicker; -------------------------------------------------------------------------------- /src/acolorpicker.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 |
6 |
7 |
8 | 9 |
10 |
11 |
12 |
13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 | 40 | 41 |
42 |
-------------------------------------------------------------------------------- /src/docs/docs.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Roboto'); 2 | 3 | * { 4 | box-sizing: border-box; 5 | } 6 | 7 | html { 8 | font-family: 'Roboto', sans-serif; 9 | font-size: 14px; 10 | font-display: fallback; 11 | line-height: 1.7; 12 | --color-light: #f2eeee; 13 | } 14 | 15 | body { 16 | margin: 0; 17 | background-color: #697b82; 18 | } 19 | 20 | footer { 21 | font-size: .8em; 22 | text-align: center; 23 | padding: 8px; 24 | } 25 | 26 | .logo { 27 | background-image: url('../../screenshots/favicon.svg'); 28 | background-size: contain; 29 | background-repeat: no-repeat; 30 | } 31 | 32 | .logo.upper-right { 33 | position: fixed; 34 | top: 16px; 35 | right: 8px; 36 | width: 50px; 37 | height: 50px; 38 | opacity: .5; 39 | pointer-events: none; 40 | z-index: 3; 41 | } 42 | 43 | code { 44 | color: #bc8f49; 45 | } 46 | 47 | code .par { 48 | color: #5b995b; 49 | } 50 | 51 | code .prop { 52 | color: #9a8297; 53 | } 54 | 55 | code .comment { 56 | color: #795548; 57 | font-style: italic; 58 | } 59 | 60 | .flexrow { 61 | display: flex; 62 | flex-direction: row; 63 | flex-wrap: wrap; 64 | } 65 | 66 | .flexcol-1 { 67 | flex-grow: 1; 68 | flex-basis: 9em; 69 | margin: 16px 8px; 70 | max-width: 1024px; 71 | } 72 | 73 | .flexcol-2 { 74 | flex-grow: 9999; 75 | flex-basis: 20em; 76 | } 77 | 78 | .flexcol-3 { 79 | flex-grow: 1; 80 | flex-basis: 9em; 81 | margin: 16px 8px; 82 | max-width: 1024px; 83 | } 84 | 85 | .shadow { 86 | box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(3, 1, 1, 0.08); 87 | } 88 | 89 | .darken { 90 | background: #0000001f; 91 | } 92 | 93 | .explanation { 94 | color: #9E9E9E; 95 | font-size: .85em; 96 | } 97 | 98 | .mark { 99 | border-bottom: solid 2px #9a8297; 100 | padding-bottom: .6em; 101 | margin-bottom: 1.6em; 102 | } 103 | 104 | .eg { 105 | position: relative; 106 | border: solid 1px #e3ddd5; 107 | padding: 4px; 108 | border-radius: 2px; 109 | background-color: #f7f1e9; 110 | } 111 | 112 | .eg::before { 113 | content: attr(title); 114 | position: absolute; 115 | top: -1.6em; 116 | font-size: .85em; 117 | font-weight: normal; 118 | color: #dedede; 119 | } 120 | 121 | .title { 122 | top: 0; 123 | padding: 0px 8px; 124 | } 125 | 126 | .title>h1 { 127 | padding: 8px 4px; 128 | margin: 0; 129 | letter-spacing: .1em; 130 | font-size: 3em; 131 | color: var(--color-light); 132 | } 133 | 134 | .title>h1.logo { 135 | padding: 4px 0 11px 38px; 136 | } 137 | 138 | .avatar { 139 | border-radius: 4px; 140 | vertical-align: text-top; 141 | object-fit: cover; 142 | width: 100%; 143 | max-height: 6.6em; 144 | opacity: .3; 145 | filter: grayscale(100%); 146 | -webkit-filter: grayscale(100%); 147 | } 148 | 149 | .badges { 150 | padding: 4px; 151 | } 152 | 153 | .badges a { 154 | text-decoration: none; 155 | } 156 | 157 | .content>nav a { 158 | color: var(--color-light); 159 | } 160 | 161 | .content>nav>ul { 162 | position: sticky; 163 | position: -webkit-sticky; 164 | top: 0px; 165 | list-style: none; 166 | padding: 0; 167 | } 168 | 169 | .content>nav>ul>li::before { 170 | content: '> '; 171 | color: #dedede; 172 | } 173 | 174 | .content>nav>ul>li>ul { 175 | font-size: .8em; 176 | top: 0px; 177 | list-style: none; 178 | padding: 0 0 0 .8em; 179 | } 180 | 181 | .content>.pens>section { 182 | background-color: #fafafa; 183 | margin: 16px 8px; 184 | padding: 8px 24px; 185 | border-radius: 2px; 186 | } 187 | 188 | .content>.pens>section>h3::before { 189 | content: '> '; 190 | color: #dedede; 191 | } 192 | 193 | table.detail { 194 | width: 100%; 195 | border-collapse: collapse; 196 | } 197 | 198 | table.detail th { 199 | font-size: .85em; 200 | text-align: left; 201 | padding-top: 16px; 202 | } 203 | 204 | table.detail td { 205 | vertical-align: top; 206 | border-bottom: solid 1px #ededed; 207 | max-width: 14em; 208 | padding: 4px 0px; 209 | } 210 | 211 | table.detail tbody, 212 | table.detail tbody>tr { 213 | transition: background-color .4s ease; 214 | } 215 | 216 | table.detail.hover-on-row tbody>tr:hover, 217 | table.detail.hover-on-body tbody:hover { 218 | background-color: #efefef; 219 | } 220 | 221 | @media (min-width: 68em) { 222 | html { 223 | font-size: 18px; 224 | } 225 | } 226 | 227 | @media (max-height: 400px) { 228 | .content>nav>ul { 229 | position: relative; 230 | } 231 | } 232 | 233 | .theme-gray { 234 | --color-light: #697b82; 235 | } 236 | 237 | .theme-gray body { 238 | background-color: #f5f5f5; 239 | } 240 | 241 | .theme-gray .avatar { 242 | opacity: .6; 243 | } -------------------------------------------------------------------------------- /src/docs/docs.js: -------------------------------------------------------------------------------- 1 | import './docs.css'; 2 | const AColorPicker = require('../acolorpicker.js'); 3 | const $title = document.querySelector('.title'); 4 | 5 | const pickers = AColorPicker.from('.picker') 6 | .on('change', (picker, color) => { 7 | console.log(color) 8 | $title.style.backgroundColor = color; 9 | if (AColorPicker.getLuminance(...picker.rgb) < .5) { 10 | $title.style.color = '#fff'; 11 | } else { 12 | $title.style.color = '#333'; 13 | } 14 | }) 15 | .on('coloradd', (picker, color) => { 16 | console.log(color) 17 | }) 18 | .on('colorremove', (picker, color) => { 19 | console.log(color) 20 | }); 21 | // console.log(pickers[0].color = '#fd0a'); 22 | // console.log(pickers[0].color); 23 | // // console.log(pickers[0].getColor('hex')); 24 | // console.log(AColorPicker.parseColor(pickers[0].color, 'hex')); -------------------------------------------------------------------------------- /src/docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | a-color-picker 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 20 | avatar 21 | 22 |
23 |
24 |

25 | a-color-picker | for web app 26 |

27 |
28 | 29 | npm version 30 | 31 | 32 | codepen 33 | 34 | 36 |
37 |
38 |
39 |
40 | 82 |
83 |
84 | 85 |

Install

86 |
    87 |
  • 88 | npm install a-color-picker --save 89 |
  • 90 |
  • 91 | bower install a-color-picker --save 92 |
  • 93 |
  • a-color-picker is available on 94 | jsdelivr 95 |
  • 96 |
97 |
98 |
99 | 100 |

Create a picker

101 |

Define an HTML element to contain the picker and use 102 | AColorPicker.from(selector) to create it. 103 |
The default picker is created with HSL, RGB and HEX controls. 104 |
The 105 | acp-color attribute is used to set the initial value.

106 |

See the Pen 108 | WJoQBm by Caldi Gianfranco ( 109 | @narsenico) on 110 | CodePen.

111 |
112 |
113 | 114 |

Choose which controls to show

115 |

Show or hide controls through attributes. 116 |
117 | acp-show-* attributes accepts 118 | yes/no/true/false values. Attributes without value are considered 119 | true. 120 |

121 |

See the Pen 123 | a-color-picker demo attr by Caldi Gianfranco ( 124 | @narsenico) on 125 | CodePen.

126 |
127 |
128 | 129 |

Palette

130 |

Show a palette of colors using the 131 | acp-palette attribute. 132 |
Set a list of colors - named color, hex rgb, rgb(), rgba(), hsl(), hsla() - pipe separated or a predefined palette (PALETTE_MATERIAL_500, 133 | PALETTE_MATERIAL_CHROME). 134 |
The 135 | acp-palette-editable attribute can be set to allow the user to change the palette.

136 |

See the Pen 138 | a-color-picker demo palette editable by Narsenico ( 139 | @narsenico) on 140 | CodePen.

141 |
142 |
143 | 144 |

Events

145 |

146 | To attach an event use 147 | on method and 148 | off to detach it. 149 |

AColorPicker.from(selector)
150 |     .on(eventName, callback)
151 |     .off(eventName, callback)
152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 166 | 167 | 168 | 169 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 181 | 182 | 183 | 184 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 196 | 197 | 198 | 199 | 202 | 203 | 204 | 205 |
Event nameCallback parameters
change 164 | picker 165 | target
170 | color 171 | selected color
coloradd 179 | picker 180 | target
185 | color 186 | color added
colorremove 194 | picker 195 | target
200 | color 201 | color removed or null if all colors are removed
206 |

207 |
208 |
209 | 210 |

Tips

211 |

212 |

    213 |
  • Click on the preview circle to copy current color
  • 214 |
  • Shift-click on a palette color to remove it
  • 215 |
  • Shift-click the '+' button to remove all the palette colors
  • 216 |
217 |

218 |
219 |
220 | 221 |

API

222 |
223 | 224 | AColorPicker.createPicker(element, options) 225 |
226 | AColorPicker.createPicker(options) 227 |

Create a color picker.

228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 241 | 242 | 243 | 244 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 261 | 262 | 263 |
Parameter
elementHTMLElement, jQuery object or css selector string. 239 |
Optional: if not defined, 240 | options.attachTo is used.
optionsSee 245 | options 246 |
Optional only if element is defined. 247 |
Return
A 259 | ACPController instance 260 |
264 |
265 |
266 | 267 | AColorPicker.from(selector, options) 268 |

Create one or more color pickers.

269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 302 | 303 | 304 |
Parameter
selectorHTMLElement, NodeList, jQuery object or css selector string.
optionsOptional, see 284 | options 285 |
Return
An array of 297 | ACPController. This array has helper methods 298 | on and 299 | off to attach/detach 300 | events to all items. 301 |
305 |
306 |
307 | 308 | AColorPicker.parseColor(color, outFormat) 309 |

Parse color in input and return formatted value.

310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 322 | 323 | 324 | 325 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 356 | 357 | 358 |
Parameter
colorValue to be parsed 321 |
Accepts color name, rgb array, hex rgb, rgb(), rgba(), hsl(), hsla()
outFormatOutput format, one of: rgb, rgbcss, rgbcss4, rgba, rgbacss, hsl, hslcss, hslcss4, hsla, hslacss, hex, hexcss4. 326 |
If outFormat is a plain object, will be filled with all formats as properties. 327 |
Return
Formatted color or 339 | undefined if not recognized. 340 |
AColorPicker.parseColor("red");           // return [255, 0, 0]
341 | AColorPicker.parseColor("red", "rgb");    // return [255, 0, 0]
342 | AColorPicker.parseColor("red", "rgbcss"); // return "rgb(255, 0, 0)"
343 | AColorPicker.parseColor("red", "rgbcss4");// return "rgb(255, 0, 0, 1)"
344 | AColorPicker.parseColor("red", "rgba");   // return [255, 0, 0, 1]
345 | AColorPicker.parseColor("red", "rgbacss");// return "rgba(255, 0, 0, 1)"
346 | AColorPicker.parseColor("red", "hsl");    // return [0,100,50]
347 | AColorPicker.parseColor("red", "hslcss"); // return "hsl(0, 100, 50)"
348 | AColorPicker.parseColor("red", "hslcss4");// return "hsl(0, 100, 50, 1)"
349 | AColorPicker.parseColor("red", "hsla");   // return [0, 100, 50, 1]
350 | AColorPicker.parseColor("red", "hslacss");// return "hsla(0, 100, 50, 1)"
351 | AColorPicker.parseColor("red", "hex");    // return "#ff0000"
352 | AColorPicker.parseColor("red", "hexcss4");// return "#ff0000ff"
353 | AColorPicker.parseColor("red", { });// return { "rgb":[255,0,0], ... }
354 | 
355 |
359 |
360 |
361 | 362 | ACPController 363 |

Can access picker properties and handle events.

364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 472 | 473 | 474 | 475 | 476 | 477 | 479 | 480 | 481 | 482 | 483 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 504 | 505 | 506 | 507 | 508 | 509 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 521 | 522 | 523 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 579 | 580 | 581 |
PropertyType
colorGet or set the current colorString|ArrayAccept: named color, hex rgb, rgb(), rgba(), hsl(), hsla()
Return: hex rgb or rgba() if alpha != 1
451 |
// set
452 | picker.color = [205, 220, 57];            // [R, G, B]
453 | picker.color = [205, 220, 57, .5];        // [R, G, B, A]
454 | picker.color = "yellow";                  // named color
455 | picker.color = "#ffdd00";                 // hex rgb
456 | picker.color = "#ffdd00ff";               // hex rgba
457 | picker.color = "#fd0";                    // short hex rgb
458 | picker.color = "#fd0f";                   // short hex rgba
459 | picker.color = "rgb(205, 220, 57)";       // rgb() notation
460 | picker.color = "rgb(205, 220, 57, .5)";   // rgb() notation + alpha (css level 4)
461 | picker.color = "rgba(205, 220, 57, .5)";  // rgba() notation
462 | picker.color = "hsl(120, 100, 125)";      // hsl() notation
463 | picker.color = "hsl(120, 100, 125, .5)";  // hsl() notation + alpha (css level 4)
464 | picker.color = "hsla(120, 100, 125, .5)"; // hsla() notation
465 | // get
466 | picker.color; // return "#ffdd00"
467 | picker.color; // return "rgba(205, 220, 57, .5)" if alpha is != 1
468 | // formatting color (see parseColor for detail)
469 | AColorPicker.parseColor(picker.color, "hsl"); // return "hsl(120, 100, 125)"
470 | 							
471 |
paletteGet or set the current palette 478 | ArrayArray of colors
484 |
// set
485 | picker.palette = ['red', '#00ff00', 'rgb(0, 0, 255)']; // array of color
486 | // get
487 | picker.palette; // return ["#ff0000","#00ff00","#0000ff"]
488 |
FunctionParameters
onAttach an event to the controller.eventNameSee 503 | events for detail
callback
510 |
picker.on("change", (picker, color) => { });
511 |
offDetach an event from the controller.eventNameSee 520 | events for detail
524 |
picker.off("change");
525 |
showShow the picker.
535 |
picker.show();
536 |
hideHide the picker.
546 |
picker.hide();
547 |
toggleShow or hide the picker.
557 |
picker.toggle();
558 |
setColorSet current colorcolorSame of 'color' property
silentIf true the change event will not be triggered
574 |
picker.setColor("red", true); // change event not triggered
576 | picker.setColor("red", false); // change event triggered
577 | picker.setColor("red"); // change event triggered
578 |
582 |
583 |
584 | 585 | options 586 |

587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 |
PropertyTypeDefault
attachToWhere to attach the picker top element, can be HTMLElement, jQuery object or css selectorString|Objectbody
showHSLIf falsy hide the HSL inputsBooleantrue
showRGBIf falsy hide the RGB inputsBooleantrue
showHEXIf falsy hide the RGB HEX inputsBooleantrue
showAlphaIf truly show control to change opacityBooleanfalse
colorInitial colorBoolean#ff0000
paletteArray of predefined colors. 636 |
Each element can be color name, rgb array, hex rgb, rgb(), rgba(), hsl(), hsla()
Arraynull
paletteEditableIf truly make the palette editableBooleanfalse
useAlphaInPaletteIf truly enable alpha channel in palette colors,
if 'auto' depends on the value of 'showAlpha'
String|Booleanauto
hueBarSizeSize of hue bar in pixel (width, height)Array[150,11]
slBarSizeSize of saturation/luminance canvas in pixel (width, height)Array[232,150]
666 |
667 |
668 |
669 |
670 | 673 | 674 | 675 | 676 | -------------------------------------------------------------------------------- /src/test-ts/test.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import * as AColorPicker from '../acolorpicker.js'; 3 | 4 | const c1 = AColorPicker.parseColor('yellow', 'hex'); 5 | const c2 = AColorPicker.parseColor('yellow'); 6 | const c3 = AColorPicker.parseColor([0, 0, 0]); 7 | const o1: AColorPicker.ACPColor = AColorPicker.parseColor('yellow', {}); 8 | const o2: Object = AColorPicker.parseColor('yellow', {}); 9 | 10 | const a1: AColorPicker.ACPController = AColorPicker.createPicker('div'); 11 | a1.element; 12 | a1.rgb = [0, 0, 0]; 13 | a1.rgba = [0, 0, 0, 0]; 14 | a1.hsl = [0, 0, 0]; 15 | a1.hsla = [0, 0, 0, 0]; 16 | a1.color = 'yellow'; 17 | const p1: string = a1.rgbhex; 18 | const p2: AColorPicker.ACPColor = a1.all; 19 | const cb1: AColorPicker.ACPCallback = (controller: AColorPicker.ACPController, color?: string) => {}; 20 | const cb2: AColorPicker.ACPCallback = () => {}; 21 | a1.onchange = cb1; 22 | a1.onchange = cb2; 23 | a1.onchange = cb2; 24 | a1.onchange = null; 25 | a1.oncoloradd = cb1; 26 | a1.oncoloradd = cb2; 27 | a1.oncoloradd = cb2; 28 | a1.oncoloradd = null; 29 | a1.oncolorremove = cb1; 30 | a1.oncolorremove = cb2; 31 | a1.oncolorremove = cb2; 32 | a1.oncolorremove = null; 33 | a1.on('change', cb1); 34 | a1.on('change', cb2); 35 | a1.off('change', cb1); 36 | a1.off('change'); 37 | 38 | // test su proprietà che devono risultare non validi 39 | // a1.element = document.querySelector('body'); 40 | // let rgb: Array = a1.element; 41 | // a1.rgbhex = '#ffffff'; -------------------------------------------------------------------------------- /src/test-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "noEmit": true, 6 | "noImplicitAny": true 7 | }, 8 | "files": [ 9 | "../acolorpicker.d.ts", 10 | "./test.ts" 11 | ] 12 | } -------------------------------------------------------------------------------- /src/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | a-color-picker test 6 | 7 | 8 | 9 | 10 | 11 | 12 |

a-color-picker test with mocha and chai

13 |
14 | 358 | 359 | 360 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * a-color-picker - utility library 3 | * https://github.com/narsenico/a-color-picker 4 | * 5 | * Copyright (c) 2017-2018, Gianfranco Caldi. 6 | * Released under the MIT License. 7 | */ 8 | 9 | import isPlainObject from 'is-plain-object'; 10 | 11 | const COLOR_NAMES = { 'aliceblue': '#F0F8FF', 'antiquewhite': '#FAEBD7', 'aqua': '#00FFFF', 'aquamarine': '#7FFFD4', 'azure': '#F0FFFF', 'beige': '#F5F5DC', 'bisque': '#FFE4C4', 'black': '#000000', 'blanchedalmond': '#FFEBCD', 'blue': '#0000FF', 'blueviolet': '#8A2BE2', 'brown': '#A52A2A', 'burlywood': '#DEB887', 'cadetblue': '#5F9EA0', 'chartreuse': '#7FFF00', 'chocolate': '#D2691E', 'coral': '#FF7F50', 'cornflowerblue': '#6495ED', 'cornsilk': '#FFF8DC', 'crimson': '#DC143C', 'cyan': '#00FFFF', 'darkblue': '#00008B', 'darkcyan': '#008B8B', 'darkgoldenrod': '#B8860B', 'darkgray': '#A9A9A9', 'darkgrey': '#A9A9A9', 'darkgreen': '#006400', 'darkkhaki': '#BDB76B', 'darkmagenta': '#8B008B', 'darkolivegreen': '#556B2F', 'darkorange': '#FF8C00', 'darkorchid': '#9932CC', 'darkred': '#8B0000', 'darksalmon': '#E9967A', 'darkseagreen': '#8FBC8F', 'darkslateblue': '#483D8B', 'darkslategray': '#2F4F4F', 'darkslategrey': '#2F4F4F', 'darkturquoise': '#00CED1', 'darkviolet': '#9400D3', 'deeppink': '#FF1493', 'deepskyblue': '#00BFFF', 'dimgray': '#696969', 'dimgrey': '#696969', 'dodgerblue': '#1E90FF', 'firebrick': '#B22222', 'floralwhite': '#FFFAF0', 'forestgreen': '#228B22', 'fuchsia': '#FF00FF', 'gainsboro': '#DCDCDC', 'ghostwhite': '#F8F8FF', 'gold': '#FFD700', 'goldenrod': '#DAA520', 'gray': '#808080', 'grey': '#808080', 'green': '#008000', 'greenyellow': '#ADFF2F', 'honeydew': '#F0FFF0', 'hotpink': '#FF69B4', 'indianred ': '#CD5C5C', 'indigo ': '#4B0082', 'ivory': '#FFFFF0', 'khaki': '#F0E68C', 'lavender': '#E6E6FA', 'lavenderblush': '#FFF0F5', 'lawngreen': '#7CFC00', 'lemonchiffon': '#FFFACD', 'lightblue': '#ADD8E6', 'lightcoral': '#F08080', 'lightcyan': '#E0FFFF', 'lightgoldenrodyellow': '#FAFAD2', 'lightgray': '#D3D3D3', 'lightgrey': '#D3D3D3', 'lightgreen': '#90EE90', 'lightpink': '#FFB6C1', 'lightsalmon': '#FFA07A', 'lightseagreen': '#20B2AA', 'lightskyblue': '#87CEFA', 'lightslategray': '#778899', 'lightslategrey': '#778899', 'lightsteelblue': '#B0C4DE', 'lightyellow': '#FFFFE0', 'lime': '#00FF00', 'limegreen': '#32CD32', 'linen': '#FAF0E6', 'magenta': '#FF00FF', 'maroon': '#800000', 'mediumaquamarine': '#66CDAA', 'mediumblue': '#0000CD', 'mediumorchid': '#BA55D3', 'mediumpurple': '#9370DB', 'mediumseagreen': '#3CB371', 'mediumslateblue': '#7B68EE', 'mediumspringgreen': '#00FA9A', 'mediumturquoise': '#48D1CC', 'mediumvioletred': '#C71585', 'midnightblue': '#191970', 'mintcream': '#F5FFFA', 'mistyrose': '#FFE4E1', 'moccasin': '#FFE4B5', 'navajowhite': '#FFDEAD', 'navy': '#000080', 'oldlace': '#FDF5E6', 'olive': '#808000', 'olivedrab': '#6B8E23', 'orange': '#FFA500', 'orangered': '#FF4500', 'orchid': '#DA70D6', 'palegoldenrod': '#EEE8AA', 'palegreen': '#98FB98', 'paleturquoise': '#AFEEEE', 'palevioletred': '#DB7093', 'papayawhip': '#FFEFD5', 'peachpuff': '#FFDAB9', 'peru': '#CD853F', 'pink': '#FFC0CB', 'plum': '#DDA0DD', 'powderblue': '#B0E0E6', 'purple': '#800080', 'rebeccapurple': '#663399', 'red': '#FF0000', 'rosybrown': '#BC8F8F', 'royalblue': '#4169E1', 'saddlebrown': '#8B4513', 'salmon': '#FA8072', 'sandybrown': '#F4A460', 'seagreen': '#2E8B57', 'seashell': '#FFF5EE', 'sienna': '#A0522D', 'silver': '#C0C0C0', 'skyblue': '#87CEEB', 'slateblue': '#6A5ACD', 'slategray': '#708090', 'slategrey': '#708090', 'snow': '#FFFAFA', 'springgreen': '#00FF7F', 'steelblue': '#4682B4', 'tan': '#D2B48C', 'teal': '#008080', 'thistle': '#D8BFD8', 'tomato': '#FF6347', 'turquoise': '#40E0D0', 'violet': '#EE82EE', 'wheat': '#F5DEB3', 'white': '#FFFFFF', 'whitesmoke': '#F5F5F5', 'yellow': '#FFFF00', 'yellowgreen': '#9ACD32' }; 12 | const PALETTE_MATERIAL_500 = ['#F44336', '#E91E63', '#E91E63', '#9C27B0', '#9C27B0', '#673AB7', '#673AB7', '#3F51B5', '#3F51B5', '#2196F3', '#2196F3', '#03A9F4', '#03A9F4', '#00BCD4', '#00BCD4', '#009688', '#009688', '#4CAF50', '#4CAF50', '#8BC34A', '#8BC34A', '#CDDC39', '#CDDC39', '#FFEB3B', '#FFEB3B', '#FFC107', '#FFC107', '#FF9800', '#FF9800', '#FF5722', '#FF5722', '#795548', '#795548', '#9E9E9E', '#9E9E9E', '#607D8B', '#607D8B']; 13 | const PALETTE_MATERIAL_CHROME = ['#f44336', '#e91e63', '#9c27b0', '#673ab7', '#3f51b5', '#2196f3', '#03a9f4', '#00bcd4', '#009688', '#4caf50', '#8bc34a', '#cddc39', '#ffeb3b', '#ffc107', '#ff9800', '#ff5722', '#795548', '#9e9e9e', '#607d8b']; 14 | 15 | function limit(value, min, max) { 16 | value = +value; 17 | return isNaN(value) ? min : (value < min ? min : (value > max ? max : value)); 18 | } 19 | 20 | function nvl(value, def) { 21 | return value === null || value === undefined ? def : value; 22 | } 23 | 24 | function ensureArray(arrayLike) { 25 | if (!arrayLike) return []; 26 | return Array.from(arrayLike); 27 | } 28 | 29 | /** 30 | * Converte il colore da [r,g,b] al formato RGB HEX. 31 | * 32 | * @param {number} r rosso (0-255) 33 | * @param {number} g verde (0-255) 34 | * @param {number} b blu (0-255) 35 | * @return {string} colore nel fomrato RGB HX (es: #ffdd00) 36 | */ 37 | function rgbToHex(r, g, b) { 38 | [r, g, b] = [limit(r, 0, 255), limit(g, 0, 255), limit(b, 0, 255)]; 39 | return "#" + ("000000" + ((r << 16) | (g << 8) | b).toString(16)).slice(-6); 40 | } 41 | 42 | /** 43 | * Converte da HSL a RGB. 44 | * @see https://gist.github.com/mjackson/5311256 45 | * 46 | * @param {number} h hue 0-360 47 | * @param {number} s saturaion 0-100 48 | * @param {(Function|number)} l luminance 0-100 49 | * @return {Array} un array con R(0-255) G(0-255) B(0-255) 50 | */ 51 | function hslToRgb(h, s, l) { 52 | let r, g, b; 53 | [h, s, l] = [limit(h, 0, 360) / 360, limit(s, 0, 100) / 100, limit(l, 0, 100) / 100]; 54 | 55 | if (s == 0) { 56 | r = g = b = l; // achromatic 57 | } else { 58 | const hue2rgb = (p, q, t) => { 59 | if (t < 0) t += 1; 60 | if (t > 1) t -= 1; 61 | if (t < 1 / 6) return p + (q - p) * 6 * t; 62 | if (t < 1 / 2) return q; 63 | if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; 64 | return p; 65 | }; 66 | 67 | const q = l < 0.5 ? l * (1 + s) : l + s - l * s; 68 | const p = (2 * l) - q; 69 | 70 | r = hue2rgb(p, q, h + (1 / 3)); 71 | g = hue2rgb(p, q, h); 72 | b = hue2rgb(p, q, h - (1 / 3)); 73 | } 74 | 75 | return [r * 255, g * 255, b * 255].map(Math.round); 76 | } 77 | 78 | /** 79 | * Converte da RGB a HSL. 80 | * @see https://gist.github.com/mjackson/5311256 81 | * 82 | * @param {number} r rosso 0-255 83 | * @param {number} g veerde 0-255 84 | * @param {number} b blu 0-255 85 | * @return {Array} un array con H(0-360) S(0-100) L(0-100) 86 | */ 87 | function rgbToHsl(r, g, b) { 88 | [r, g, b] = [limit(r, 0, 255) / 255, limit(g, 0, 255) / 255, limit(b, 0, 255) / 255]; 89 | 90 | const max = Math.max(r, g, b), 91 | min = Math.min(r, g, b); 92 | let h, s, l = (max + min) / 2; 93 | 94 | if (max == min) { 95 | h = s = 0; // achromatic 96 | } else { 97 | const d = max - min; 98 | s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 99 | 100 | switch (max) { 101 | case r: 102 | h = ((g - b) / d) + (g < b ? 6 : 0); 103 | break; 104 | case g: 105 | h = ((b - r) / d) + 2; 106 | break; 107 | case b: 108 | h = ((r - g) / d) + 4; 109 | break; 110 | } 111 | 112 | h /= 6; 113 | } 114 | 115 | return [h * 360, s * 100, l * 100].map(Math.round); 116 | } 117 | 118 | 119 | /** 120 | * Converte from RGB to HSV. 121 | * 122 | * @param {number} r rosso 0-255 123 | * @param {number} g veerde 0-255 124 | * @param {number} b blu 0-255 125 | * @return {Array} un array con H(0-360) S(0-100) V(0-100) 126 | */ 127 | function rgbToHsv(r, g, b) { 128 | [r, g, b] = [limit(r, 0, 255) / 255, limit(g, 0, 255) / 255, limit(b, 0, 255) / 255]; 129 | const max = Math.max(r, g, b), 130 | min = Math.min(r, g, b); 131 | let h, s, v = max; 132 | let d = max - min; 133 | s = max === 0 ? 0 : d / max; 134 | if(max == min) { 135 | h = 0; 136 | } else { 137 | switch(max) { 138 | case r: h = (g - b) / d + (g < b ? 6 : 0); break; 139 | case g: h = (b - r) / d + 2; break; 140 | case b: h = (r - g) / d + 4; break; 141 | } 142 | h /= 6; 143 | } 144 | return [h, s, v]; 145 | } 146 | 147 | function rgbToInt(r, g, b) { 148 | return (r << 16) | (g << 8) | b; 149 | } 150 | 151 | function intToRgb(int) { 152 | return [ 153 | (int >> 16) & 255, //r 154 | (int >> 8) & 255, //g 155 | int & 255 //b 156 | ]; 157 | } 158 | 159 | /** 160 | * @deprecated usare cssColorToRgba() 161 | * @param {string} color 162 | */ 163 | function cssColorToRgb(color) { 164 | if (color) { 165 | const colorByName = COLOR_NAMES[color.toString().toLowerCase()]; 166 | // considero sia il formato esteso #RRGGGBB che quello corto #RGB 167 | // provo a estrarre i valori da colorByName solo se questo è valorizzato, altrimenti uso direttamente color 168 | const [, , , r, g, b, , rr, gg, bb] = /^\s*#?((([0-9A-F])([0-9A-F])([0-9A-F]))|(([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})))\s*$/i.exec(colorByName || color) || []; 169 | if (r !== undefined) { 170 | return [ 171 | parseInt(r + r, 16), 172 | parseInt(g + g, 16), 173 | parseInt(b + b, 16) 174 | ]; 175 | } else if (rr !== undefined) { 176 | return [ 177 | parseInt(rr, 16), 178 | parseInt(gg, 16), 179 | parseInt(bb, 16) 180 | ]; 181 | } 182 | } 183 | return undefined; 184 | } 185 | 186 | function cssColorToRgba(color) { 187 | if (color) { 188 | const colorByName = COLOR_NAMES[color.toString().toLowerCase()]; 189 | // considero sia il formato esteso #RRGGGBB[AA] che quello corto #RGB[A] 190 | // provo a estrarre i valori da colorByName solo se questo è valorizzato, altrimenti uso direttamente color 191 | const [, , , r, g, b, a, , rr, gg, bb, aa] = /^\s*#?((([0-9A-F])([0-9A-F])([0-9A-F])([0-9A-F])?)|(([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})?))\s*$/i.exec(colorByName || color) || []; 192 | if (r !== undefined) { 193 | return [ 194 | parseInt(r + r, 16), 195 | parseInt(g + g, 16), 196 | parseInt(b + b, 16), 197 | a ? +((parseInt(a + a, 16)) / 255).toFixed(2) : 1 198 | ]; 199 | } else if (rr !== undefined) { 200 | return [ 201 | parseInt(rr, 16), 202 | parseInt(gg, 16), 203 | parseInt(bb, 16), 204 | aa ? +((parseInt(aa, 16)) / 255).toFixed(2) : 1 205 | ]; 206 | } 207 | } 208 | return undefined; 209 | } 210 | 211 | /** 212 | * @deprecated usare cssRgbaToRgba() 213 | * @param {string} rgb 214 | */ 215 | function cssRgbToRgb(rgb) { 216 | if (rgb) { 217 | // rgb(int, int, int) 218 | const [m, r, g, b] = /^rgb\((\d+)[\s,](\d+)[\s,](\d+)\)/i.exec(rgb) || []; 219 | return m ? [limit(r, 0, 255), limit(g, 0, 255), limit(b, 0, 255)] : undefined; 220 | } 221 | return undefined; 222 | } 223 | 224 | function cssRgbaToRgba(rgba) { 225 | if (rgba) { 226 | // in CSS Colors Level 4 rgba() è un alias di rgb() 227 | // rgb[a](int, int, int[, dec]) 228 | const [m, r, g, b, , a] = /^rgba?\((\d+)\s*[\s,]\s*(\d+)\s*[\s,]\s*(\d+)(\s*[\s,]\s*(\d*(.\d+)?))?\)/i.exec(rgba) || []; 229 | return m ? [limit(r, 0, 255), limit(g, 0, 255), limit(b, 0, 255), limit(nvl(a, 1), 0, 1)] : undefined; 230 | } 231 | return undefined; 232 | } 233 | 234 | /** 235 | * Converte il colore in ingresso nel formato [r,g,b]. 236 | * Color può assumere questi valori: 237 | * - array con [r,g,b] (viene ritornato così come è) 238 | * - nome del colore 239 | * - colore nel formato RGB HEX sia compatto che esteso 240 | * 241 | * @param {string|array} color Il colore da convertire 242 | * @return {array} colore nel formato [r,g,b] o undefined se non valido 243 | */ 244 | function parseColorToRgb(color) { 245 | if (Array.isArray(color)) { 246 | color = [limit(color[0], 0, 255), limit(color[1], 0, 255), limit(color[2], 0, 255)]; 247 | return color; 248 | } else { 249 | return cssColorToRgb(color) || cssRgbToRgb(color); 250 | } 251 | } 252 | 253 | function parseColorToRgba(color) { 254 | if (Array.isArray(color)) { 255 | color = [ 256 | limit(color[0], 0, 255), 257 | limit(color[1], 0, 255), 258 | limit(color[2], 0, 255), 259 | limit(nvl(color[3], 1), 0, 1) 260 | ]; 261 | return color; 262 | } else { 263 | const parsed = cssColorToRgba(color) || cssRgbaToRgba(color); 264 | if (parsed && parsed.length === 3) { 265 | parsed.push(1); 266 | } 267 | return parsed; 268 | } 269 | } 270 | 271 | /** 272 | * @deprecated usare cssHslaToHsla() 273 | * @param {string} hsl 274 | */ 275 | function cssHslToHsl(hsl) { 276 | if (hsl) { 277 | // hsl(int, int, int) 278 | const [m, h, s, l] = /^hsl\((\d+)[\s,](\d+)[\s,](\d+)\)/i.exec(hsl) || []; 279 | return m ? [limit(h, 0, 360), limit(s, 0, 100), limit(l, 0, 100)] : undefined; 280 | } 281 | return undefined; 282 | } 283 | 284 | function cssHslaToHsla(hsla) { 285 | if (hsla) { 286 | // in CSS Colors Level 4 hsla() è un alias di hsl() 287 | // hsl[a](int, int, int[, dec]) 288 | const [m, h, s, l, , a] = /^hsla?\((\d+)\s*[\s,]\s*(\d+)\s*[\s,]\s*(\d+)(\s*[\s,]\s*(\d*(.\d+)?))?\)/i.exec(hsla) || []; 289 | return m ? [limit(h, 0, 255), limit(s, 0, 255), limit(l, 0, 255), limit(nvl(a, 1), 0, 1)] : undefined; 290 | } 291 | return undefined; 292 | } 293 | 294 | function parseColorToHsl(color) { 295 | if (Array.isArray(color)) { 296 | color = [limit(color[0], 0, 360), limit(color[1], 0, 100), limit(color[2], 0, 100)]; 297 | return color; 298 | } else { 299 | return cssHslToHsl(color); 300 | } 301 | } 302 | 303 | function parseColorToHsla(color) { 304 | if (Array.isArray(color)) { 305 | color = [ 306 | limit(color[0], 0, 360), 307 | limit(color[1], 0, 100), 308 | limit(color[2], 0, 100), 309 | limit(nvl(color[3], 1), 0, 1) 310 | ]; 311 | return color; 312 | } else { 313 | const parsed = cssHslaToHsla(color); 314 | if (parsed && parsed.length === 3) { 315 | parsed.push(1); 316 | } 317 | return parsed; 318 | } 319 | } 320 | 321 | /** 322 | * TODO: i formati *css4 devono restituire alpha solo se questa è < 1 323 | * 324 | * outFormat può assumere questi valori: 325 | * rgb (default), rgbcss, rgbcss4, rgba, rgbacss, hsl, hslcss, hslcss4, hsla, hslacss, hex, hexcss4, int 326 | * 327 | * se outFormat è un oggetto (typeof 'object') gli vengono aggiunte tante proprietà 328 | * quanti sono i formati supportati e i rispettivi valori 329 | * 330 | * @param {any} color 331 | * @param {String|Object} outFormat formato output 332 | * @return {String} colore formattato o undefined se non riconosciuto 333 | */ 334 | function parseColor(color, outFormat) { 335 | outFormat = (outFormat || 'rgb'); 336 | if (color !== null && color !== undefined) { 337 | let pp; 338 | if ((pp = parseColorToRgba(color)) || 339 | ((pp = parseColorToHsla(color)) && (pp = [...hslToRgb(...pp), pp[3]]))) { 340 | 341 | // se outFormat è un plain object quindi {} oppure new Object() 342 | // if (typeof outFormat === 'object') { 343 | if (isPlainObject(outFormat)) { 344 | return ['rgb', 'rgbcss', 'rgbcss4', 'rgba', 'rgbacss', 345 | 'hsl', 'hslcss', 'hslcss4', 'hsla', 'hslacss', 346 | 'hex', 'hexcss4', 'int'].reduce((m, f) => { m[f] = formatColor(pp, f); return m; }, outFormat || {}); 347 | } else { 348 | // per sicurezza trasformo in stringa (potrebbe essere un numero) 349 | return formatColor(pp, outFormat.toString().toLowerCase()); 350 | } 351 | } 352 | } 353 | 354 | return undefined; 355 | } 356 | 357 | /** 358 | * 359 | * @private 360 | * @param {Array} pp rgba 361 | * @param {String} outFormat 362 | */ 363 | function formatColor(pp, outFormat) { 364 | switch (outFormat) { 365 | case 'rgb': 366 | default: 367 | return pp.slice(0, 3); 368 | case 'rgbcss': 369 | return `rgb(${pp[0]}, ${pp[1]}, ${pp[2]})`; 370 | case 'rgbcss4': 371 | return `rgb(${pp[0]}, ${pp[1]}, ${pp[2]}, ${pp[3]})`; 372 | case 'rgba': 373 | return pp; 374 | case 'rgbacss': 375 | return `rgba(${pp[0]}, ${pp[1]}, ${pp[2]}, ${pp[3]})`; 376 | case 'hsl': 377 | return rgbToHsl(...pp); 378 | case 'hslcss': 379 | pp = rgbToHsl(...pp); 380 | return `hsl(${pp[0]}, ${pp[1]}, ${pp[2]})`; 381 | case 'hslcss4': 382 | const hh = rgbToHsl(...pp); 383 | return `hsl(${hh[0]}, ${hh[1]}, ${hh[2]}, ${pp[3]})`; 384 | case 'hsla': 385 | return [...rgbToHsl(...pp), pp[3]]; 386 | case 'hslacss': 387 | const ha = rgbToHsl(...pp); 388 | return `hsla(${ha[0]}, ${ha[1]}, ${ha[2]}, ${pp[3]})`; 389 | case 'hex': 390 | return rgbToHex(...pp); 391 | case 'hexcss4': 392 | return rgbToHex(...pp) + ('00' + parseInt(pp[3] * 255).toString(16)).slice(-2); 393 | case 'int': 394 | return rgbToInt(...pp); 395 | } 396 | } 397 | 398 | /** 399 | * Più il risultato tende a 1 e più è luminoso. 400 | * 401 | * @param {number} r red 402 | * @param {number} g green 403 | * @param {number} b blue 404 | * @return {number} la luminosità da 0 (scuro) a 1 (chiaro) 405 | */ 406 | function getLuminance(r, g, b) { 407 | r = r / 255; 408 | r = r < 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4); 409 | g = g / 255; 410 | g = g < 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4); 411 | b = b / 255; 412 | b = b < 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4); 413 | return (0.2126 * r) + (0.7152 * g) + (0.0722 * b); 414 | } 415 | 416 | export { 417 | COLOR_NAMES, 418 | PALETTE_MATERIAL_500, 419 | PALETTE_MATERIAL_CHROME, 420 | rgbToHex, 421 | hslToRgb, 422 | rgbToHsl, 423 | rgbToHsv, 424 | rgbToInt, 425 | intToRgb, 426 | cssColorToRgb, 427 | cssColorToRgba, 428 | cssRgbToRgb, 429 | cssRgbaToRgba, 430 | parseColorToRgb, 431 | parseColorToRgba, 432 | cssHslToHsl, 433 | cssHslaToHsla, 434 | parseColorToHsl, 435 | parseColorToHsla, 436 | parseColor, 437 | getLuminance, 438 | limit, 439 | ensureArray, 440 | nvl 441 | }; -------------------------------------------------------------------------------- /webpack.common.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'), 2 | CopyWebpackPlugin = require('copy-webpack-plugin'), 3 | CleanWebpackPlugin = require('clean-webpack-plugin'); 4 | 5 | const banner = `a-color-picker (https://github.com/narsenico/a-color-picker) 6 | 7 | Copyright (c) 2017-2018, Gianfranco Caldi. 8 | Released under the MIT License.`; 9 | 10 | module.exports = { 11 | entry: { 12 | acolorpicker: './src/acolorpicker.js' 13 | }, 14 | output: { 15 | path: __dirname + '/dist', 16 | libraryTarget: 'umd', 17 | library: 'AColorPicker', 18 | umdNamedDefine: true, 19 | globalObject: 'typeof self !== \'undefined\' ? self : this' 20 | }, 21 | plugins: [ 22 | // pulisce le cartelle specificate in caso di successo nella compilazione 23 | new CleanWebpackPlugin(['dist']), 24 | // copio i file di definizione di typescript nella cartella di destinazione 25 | new CopyWebpackPlugin([ 26 | { 27 | from: 'src/*.d.ts', 28 | to: '[name].ts', 29 | toType: 'template' 30 | } 31 | ]), 32 | // aggiunge un banner (con il copyright) in cima al file prodotto 33 | new webpack.BannerPlugin(banner) 34 | ], 35 | module: { 36 | rules: [{ 37 | test: /acolorpicker\.css$/, 38 | use: [ 39 | { 40 | loader: 'to-string-loader' 41 | }, { 42 | loader: 'css-loader', 43 | options: { 44 | minimize: true 45 | } 46 | } 47 | ] 48 | }, { 49 | test: /[^acolorpicker]\.css$/, 50 | use: [ 51 | { 52 | loader: 'style-loader' 53 | }, { 54 | loader: 'css-loader', 55 | options: { 56 | minimize: true 57 | } 58 | } 59 | ], 60 | }, { 61 | test: /\.js$/, 62 | exclude: /(node_modules)/, 63 | use: { 64 | loader: 'babel-loader', 65 | options: { 66 | presets: ['env'] 67 | } 68 | } 69 | }, { 70 | test: /\.(html)$/, 71 | use: { 72 | loader: 'html-loader', 73 | options: { 74 | minimize: true 75 | } 76 | } 77 | }] 78 | } 79 | } -------------------------------------------------------------------------------- /webpack.dev.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge'), 2 | HtmlWebpackPlugin = require('html-webpack-plugin'), 3 | common = require('./webpack.common.js'); 4 | 5 | module.exports = merge(common, { 6 | mode: 'development', 7 | // da usare solo in sviluppo 8 | devtool: 'inline-source-map', 9 | devServer: { 10 | contentBase: 'dist/' // equivalente a webpack-dev-server --content-base ./dist 11 | }, 12 | plugins: [ 13 | new HtmlWebpackPlugin({ 14 | title: '[TEST] a-color-picker', 15 | filename: 'test.html', 16 | template: 'src/test.html' 17 | }) 18 | ] 19 | }) -------------------------------------------------------------------------------- /webpack.docs.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'), 2 | HtmlWebpackPlugin = require('html-webpack-plugin'), 3 | CleanWebpackPlugin = require('clean-webpack-plugin'); 4 | 5 | module.exports = { 6 | entry: { 7 | docs: './src/docs/docs.js' 8 | }, 9 | output: { 10 | path: __dirname + '/docs', 11 | filename: '[name].js' 12 | }, 13 | mode: 'production', 14 | plugins: [ 15 | // pulisce le cartelle specificate in caso di successo nella compilazione 16 | new CleanWebpackPlugin(['docs']), 17 | // usa un file come template 18 | new HtmlWebpackPlugin({ 19 | filename: 'index.html', 20 | template: './src/docs/index.html' 21 | }), 22 | // new UglifyJSPlugin(), 23 | new webpack.DefinePlugin({ 24 | 'process.env': { 25 | 'NODE_ENV': JSON.stringify('production') 26 | } 27 | }) 28 | ], 29 | module: { 30 | rules: [{ 31 | test: /acolorpicker\.css$/, 32 | use: ['to-string-loader', 'css-loader'] 33 | }, { 34 | test: /[^acolorpicker]\.css$/, 35 | use: [ 36 | { 37 | loader: 'style-loader' 38 | }, { 39 | loader: 'css-loader', 40 | options: { 41 | minimize: true 42 | } 43 | } 44 | ] 45 | }, { 46 | test: /\.js$/, 47 | exclude: /(node_modules)/, 48 | use: { 49 | loader: 'babel-loader', 50 | options: { 51 | presets: ['env'] 52 | } 53 | } 54 | }, { 55 | test: /\.svg$/, 56 | use: { 57 | loader: 'svg-url-loader', 58 | options: { 59 | stripdeclarations: true 60 | } 61 | } 62 | }, { 63 | test: /\.(html)$/, 64 | use: { 65 | loader: 'html-loader', 66 | options: { 67 | minimize: true 68 | } 69 | } 70 | }] 71 | }, 72 | devtool: 'cheap-module-source-map', 73 | devServer: { 74 | contentBase: 'docs/' // equivalente a webpack-dev-server --content-base ./docs 75 | }, 76 | } -------------------------------------------------------------------------------- /webpack.prod.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge'), 2 | common = require('./webpack.common.js'), 3 | webpack = require('webpack'), 4 | UglifyJSPlugin = require('uglifyjs-webpack-plugin'); 5 | 6 | module.exports = merge(common, { 7 | mode: 'production', 8 | devtool: 'cheap-module-source-map', 9 | plugins: [ 10 | new UglifyJSPlugin(), 11 | new webpack.DefinePlugin({ 12 | 'process.env': { 13 | 'NODE_ENV': JSON.stringify('production') 14 | } 15 | }) 16 | ] 17 | }) --------------------------------------------------------------------------------