spectrum-rails 1.2.0 → 1.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/spectrum-rails/version.rb +1 -1
- data/vendor/assets/javascripts/spectrum-min.js +1 -0
- data/vendor/assets/javascripts/spectrum.js +1374 -1043
- data/vendor/assets/stylesheets/spectrum.css +81 -85
- metadata +13 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e0056a77b0e6e14c395beae83632e947cdba7740889850cf387b0760fd0780ec
|
4
|
+
data.tar.gz: 95a6f7caa9446684f05cb7fae3d69e07f2b05c19e838ae3cb3ee89d78e13f85d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 343a9444e178da55a8a91f8a949f7b6877b27d9d011c6d3f015edce7689069ea78df903ac1245a02e82c64dafc22a74a2900facb8a657bd4f40cc574118e2786
|
7
|
+
data.tar.gz: 974f376b3d4e7e9603f1a1124b88450d84e9490e75c46b790acbc9e9e3451bfe96d765c122db485b19f4a0968a3fa27fd9a6c2f52ebd6bfcedc5fe0fa0f4da15
|
@@ -0,0 +1 @@
|
|
1
|
+
!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports&&"object"==typeof module?module.exports=t(require("jquery")):t(jQuery)}(function(jt,Et){"use strict";var t,Dt={beforeShow:r,move:r,change:r,show:r,hide:r,color:!1,flat:!1,showInput:!1,allowEmpty:!1,showButtons:!0,clickoutFiresChange:!0,showInitial:!1,showPalette:!1,showPaletteOnly:!1,hideAfterPaletteSelect:!1,togglePaletteOnly:!1,showSelectionPalette:!0,localStorageKey:!1,appendTo:"body",maxSelectionSize:7,cancelText:"cancel",chooseText:"choose",togglePaletteMoreText:"more",togglePaletteLessText:"less",clearText:"Clear Color Selection",noColorSelectedText:"No Color Selected",preferredFormat:!1,className:"",containerClassName:"",replacerClassName:"",showAlpha:!1,theme:"sp-light",palette:[["#ffffff","#000000","#ff0000","#ff8000","#ffff00","#008000","#0000ff","#4b0082","#9400d3"]],selectionPalette:[],disabled:!1,offset:null},It=[],zt=!!/msie/i.exec(window.navigator.userAgent),Bt=((t=document.createElement("div").style).cssText="background-color:rgba(0,0,0,.5)",e(t.backgroundColor,"rgba")||e(t.backgroundColor,"hsla")),Lt=["<div class='sp-replacer'>","<div class='sp-preview'><div class='sp-preview-inner'></div></div>","<div class='sp-dd'>▼</div>","</div>"].join(""),Kt=function(){var t="";if(zt)for(var e=1;e<=6;e++)t+="<div class='sp-"+e+"'></div>";return["<div class='sp-container sp-hidden'>","<div class='sp-palette-container'>","<div class='sp-palette sp-thumb sp-cf'></div>","<div class='sp-palette-button-container sp-cf'>","<button type='button' class='sp-palette-toggle'></button>","</div>","</div>","<div class='sp-picker-container'>","<div class='sp-top sp-cf'>","<div class='sp-fill'></div>","<div class='sp-top-inner'>","<div class='sp-color'>","<div class='sp-sat'>","<div class='sp-val'>","<div class='sp-dragger'></div>","</div>","</div>","</div>","<div class='sp-clear sp-clear-display'>","</div>","<div class='sp-hue'>","<div class='sp-slider'></div>",t,"</div>","</div>","<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>","</div>","<div class='sp-input-container sp-cf'>","<input class='sp-input' type='text' spellcheck='false' />","</div>","<div class='sp-initial sp-thumb sp-cf'></div>","<div class='sp-button-container sp-cf'>","<a class='sp-cancel' href='#'></a>","<button type='button' class='sp-choose'></button>","</div>","</div>","</div>"].join("")}();function e(t,e){return!!~(""+t).indexOf(e)}function Vt(t,e,r,a){for(var n=[],o=0;o<t.length;o++){var i,s,l,c,f=t[o];f?(s=(i=tinycolor(f)).toHsl().l<.5?"sp-thumb-el sp-thumb-dark":"sp-thumb-el sp-thumb-light",s+=tinycolor.equals(e,f)?" sp-thumb-active":"",l=i.toString(a.preferredFormat||"rgb"),c=Bt?"background-color:"+i.toRgbString():"filter:"+i.toFilter(),n.push('<span title="'+l+'" data-color="'+i.toRgbString()+'" class="'+s+'"><span class="sp-thumb-inner" style="'+c+';"></span></span>')):n.push(jt("<div />").append(jt('<span data-color="" style="background-color:transparent;" class="sp-clear-display"></span>').attr("title",a.noColorSelectedText)).html())}return"<div class='sp-cf "+r+"'>"+n.join("")+"</div>"}function o(t,e){var r,a,n,o,i,s,l,u=(i=e,s=t,(l=jt.extend({},Dt,i)).callbacks={move:Wt(l.move,s),change:Wt(l.change,s),show:Wt(l.show,s),hide:Wt(l.hide,s),beforeShow:Wt(l.beforeShow,s)},l),d=u.flat,c=u.showSelectionPalette,f=u.localStorageKey,h=u.theme,p=u.callbacks,g=(r=Ot,function(){var t=this,e=arguments;n&&clearTimeout(o),!n&&o||(o=setTimeout(function(){o=null,r.apply(t,e)},a))}),b=!(a=10),v=!1,m=0,y=0,w=0,_=0,x=0,k=0,S=0,C=0,P=0,A=0,M=1,R=[],H=[],F={},T=u.selectionPalette.slice(0),O=u.maxSelectionSize,q="sp-dragging",N=null,j=t.ownerDocument,E=(j.body,jt(t)),D=!1,I=jt(Kt,j).addClass(h),z=I.find(".sp-picker-container"),B=I.find(".sp-color"),L=I.find(".sp-dragger"),K=I.find(".sp-hue"),V=I.find(".sp-slider"),$=I.find(".sp-alpha-inner"),W=I.find(".sp-alpha"),X=I.find(".sp-alpha-handle"),Y=I.find(".sp-input"),G=I.find(".sp-palette"),Q=I.find(".sp-initial"),J=I.find(".sp-cancel"),U=I.find(".sp-clear"),Z=I.find(".sp-choose"),tt=I.find(".sp-palette-toggle"),et=E.is("input"),rt=et&&"color"===E.attr("type")&&Yt(),at=et&&!d,nt=at?jt(Lt).addClass(h).addClass(u.className).addClass(u.replacerClassName):jt([]),ot=at?nt:E,it=nt.find(".sp-preview-inner"),st=u.color||et&&E.val(),lt=!1,ct=u.preferredFormat,ft=!u.showButtons||u.clickoutFiresChange,ht=!st,ut=u.allowEmpty&&!rt;function dt(){if(u.showPaletteOnly&&(u.showPalette=!0),tt.text(u.showPaletteOnly?u.togglePaletteMoreText:u.togglePaletteLessText),u.palette){R=u.palette.slice(0),H=jt.isArray(R[0])?R:[R],F={};for(var t=0;t<H.length;t++)for(var e=0;e<H[t].length;e++){var r=tinycolor(H[t][e]).toRgbString();F[r]=!0}}I.toggleClass("sp-flat",d),I.toggleClass("sp-input-disabled",!u.showInput),I.toggleClass("sp-alpha-enabled",u.showAlpha),I.toggleClass("sp-clear-enabled",ut),I.toggleClass("sp-buttons-disabled",!u.showButtons),I.toggleClass("sp-palette-buttons-disabled",!u.togglePaletteOnly),I.toggleClass("sp-palette-disabled",!u.showPalette),I.toggleClass("sp-palette-only",u.showPaletteOnly),I.toggleClass("sp-initial-disabled",!u.showInitial),I.addClass(u.className).addClass(u.containerClassName),Ot()}function pt(){if(f&&window.localStorage){try{var t=window.localStorage[f].split(",#");1<t.length&&(delete window.localStorage[f],jt.each(t,function(t,e){gt(e)}))}catch(t){}try{T=window.localStorage[f].split(";")}catch(t){}}}function gt(t){if(c){var e=tinycolor(t).toRgbString();if(!F[e]&&-1===jt.inArray(e,T))for(T.push(e);T.length>O;)T.shift();if(f&&window.localStorage)try{window.localStorage[f]=T.join(";")}catch(t){}}}function bt(){var r=Mt(),t=jt.map(H,function(t,e){return Vt(t,r,"sp-palette-row sp-palette-row-"+e,u)});pt(),T&&t.push(Vt(function(){var t=[];if(u.showPalette)for(var e=0;e<T.length;e++){var r=tinycolor(T[e]).toRgbString();F[r]||t.push(T[e])}return t.reverse().slice(0,u.maxSelectionSize)}(),r,"sp-palette-row sp-palette-row-selection",u)),G.html(t.join(""))}function vt(){var t,e;u.showInitial&&(t=lt,e=Mt(),Q.html(Vt([t,e],e,"sp-palette-row-initial",u)))}function mt(){(y<=0||m<=0||_<=0)&&Ot(),v=!0,I.addClass(q),N=null,E.trigger("dragstart.spectrum",[Mt()])}function yt(){v=!1,I.removeClass(q),E.trigger("dragstop.spectrum",[Mt()])}function wt(){var t,e=Y.val();null!==e&&""!==e||!ut?(t=tinycolor(e)).isValid()?(At(t),Rt(),Tt()):Y.addClass("sp-validation-error"):(At(null),Rt(),Tt())}function _t(){(b?Ct:xt)()}function xt(){var t=jt.Event("beforeShow.spectrum");b?Ot():(E.trigger(t,[Mt()]),!1===p.beforeShow(Mt())||t.isDefaultPrevented()||(function(){for(var t=0;t<It.length;t++)It[t]&&It[t].hide()}(),b=!0,jt(j).on("keydown.spectrum",kt),jt(j).on("click.spectrum",St),jt(window).on("resize.spectrum",g),nt.addClass("sp-active"),I.removeClass("sp-hidden"),Ot(),Ht(),lt=Mt(),vt(),p.show(lt),E.trigger("show.spectrum",[lt])))}function kt(t){27===t.keyCode&&Ct()}function St(t){2!=t.button&&(v||(ft?Tt(!0):Pt(),Ct()))}function Ct(){b&&!d&&(b=!1,jt(j).off("keydown.spectrum",kt),jt(j).off("click.spectrum",St),jt(window).off("resize.spectrum",g),nt.removeClass("sp-active"),I.addClass("sp-hidden"),p.hide(Mt()),E.trigger("hide.spectrum",[Mt()]))}function Pt(){At(lt,!0),Tt(!0)}function At(t,e){var r,a;tinycolor.equals(t,Mt())?Ht():(!t&&ut?ht=!0:(ht=!1,a=(r=tinycolor(t)).toHsv(),C=a.h%360/360,P=a.s,A=a.v,M=a.a),Ht(),r&&r.isValid()&&!e&&(ct=u.preferredFormat||r.getFormat()))}function Mt(t){return t=t||{},ut&&ht?null:tinycolor.fromRatio({h:C,s:P,v:A,a:Math.round(1e3*M)/1e3},{format:t.format||ct})}function Rt(){Ht(),p.move(Mt()),E.trigger("move.spectrum",[Mt()])}function Ht(){Y.removeClass("sp-validation-error"),Ft();var t=tinycolor.fromRatio({h:C,s:1,v:1});B.css("background-color",t.toHexString());var e=ct;M<1&&(0!==M||"name"!==e)&&("hex"!==e&&"hex3"!==e&&"hex6"!==e&&"name"!==e||(e="rgb"));var r,a,n,o,i,s=Mt({format:e}),l="";it.removeClass("sp-clear-display"),it.css("background-color","transparent"),!s&&ut?it.addClass("sp-clear-display"):(r=s.toHexString(),a=s.toRgbString(),Bt||1===s.alpha?it.css("background-color",a):(it.css("background-color","transparent"),it.css("filter",s.toFilter())),u.showAlpha&&((n=s.toRgb()).a=0,i="linear-gradient(left, "+(o=tinycolor(n).toRgbString())+", "+r+")",zt?$.css("filter",tinycolor(o).toFilter({gradientType:1},r)):($.css("background","-webkit-"+i),$.css("background","-moz-"+i),$.css("background","-ms-"+i),$.css("background","linear-gradient(to right, "+o+", "+r+")"))),l=s.toString(e)),u.showInput&&Y.val(l),u.showPalette&&bt(),vt()}function Ft(){var t,e,r,a,n=P,o=A;ut&&ht?(X.hide(),V.hide(),L.hide()):(X.show(),V.show(),L.show(),t=n*m,e=y-o*y,t=Math.max(-w,Math.min(m-w,t-w)),e=Math.max(-w,Math.min(y-w,e-w)),L.css({top:e+"px",left:t+"px"}),r=M*x,X.css({left:r-k/2+"px"}),a=C*_,V.css({top:a-S+"px"}))}function Tt(t){var e=Mt(),r="",a=!tinycolor.equals(e,lt);e&&(r=e.toString(ct),gt(e)),et&&E.val(r),t&&a&&(p.change(e),E.trigger("change",[e]))}function Ot(){var t,e,r,a,n,o,i,s,l,c,f,h;b&&(m=B.width(),y=B.height(),w=L.height(),K.width(),_=K.height(),S=V.height(),x=W.width(),k=X.width(),d||(I.css("position","absolute"),u.offset?I.offset(u.offset):I.offset((e=ot,r=(t=I).outerWidth(),a=t.outerHeight(),n=e.outerHeight(),o=t[0].ownerDocument,i=o.documentElement,s=i.clientWidth+jt(o).scrollLeft(),l=i.clientHeight+jt(o).scrollTop(),c=e.offset(),f=c.left,h=c.top,h+=n,f-=Math.min(f,s<f+r&&r<s?Math.abs(f+r-s):0),{top:h-=Math.min(h,l<h+a&&a<l?Math.abs(+(a+n)):0),bottom:c.bottom,left:f,right:c.right,width:c.width,height:c.height}))),Ft(),u.showPalette&&bt(),E.trigger("reflow.spectrum"))}function qt(){Ct(),D=!0,E.attr("disabled",!0),ot.addClass("sp-disabled")}!function(){var t;function e(t){return t.data&&t.data.ignore?(At(jt(t.target).closest(".sp-thumb-el").data("color")),Rt()):(At(jt(t.target).closest(".sp-thumb-el").data("color")),Rt(),u.hideAfterPaletteSelect?(Tt(!0),Ct()):Tt()),!1}zt&&I.find("*:not(input)").attr("unselectable","on"),dt(),at&&E.after(nt).hide(),ut||U.hide(),d?E.after(I).hide():(1!==(t="parent"===u.appendTo?E.parent():jt(u.appendTo)).length&&(t=jt("body")),t.append(I)),pt(),ot.on("click.spectrum touchstart.spectrum",function(t){D||_t(),t.stopPropagation(),jt(t.target).is("input")||t.preventDefault()}),!E.is(":disabled")&&!0!==u.disabled||qt(),I.click($t),Y.change(wt),Y.on("paste",function(){setTimeout(wt,1)}),Y.keydown(function(t){13==t.keyCode&&wt()}),J.text(u.cancelText),J.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),Pt(),Ct()}),U.attr("title",u.clearText),U.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),ht=!0,Rt(),d&&Tt(!0)}),Z.text(u.chooseText),Z.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),zt&&Y.is(":focus")&&Y.trigger("change"),Y.hasClass("sp-validation-error")||(Tt(!0),Ct())}),tt.text(u.showPaletteOnly?u.togglePaletteMoreText:u.togglePaletteLessText),tt.on("click.spectrum",function(t){t.stopPropagation(),t.preventDefault(),u.showPaletteOnly=!u.showPaletteOnly,u.showPaletteOnly||d||I.css("left","-="+(z.outerWidth(!0)+5)),dt()}),Xt(W,function(t,e,r){M=t/x,ht=!1,r.shiftKey&&(M=Math.round(10*M)/10),Rt()},mt,yt),Xt(K,function(t,e){C=parseFloat(e/_),ht=!1,u.showAlpha||(M=1),Rt()},mt,yt),Xt(B,function(t,e,r){var a,n,o;r.shiftKey?N||(a=P*m,n=y-A*y,o=Math.abs(t-a)>Math.abs(e-n),N=o?"x":"y"):N=null;var i=!N||"y"===N;N&&"x"!==N||(P=parseFloat(t/m)),i&&(A=parseFloat((y-e)/y)),ht=!1,u.showAlpha||(M=1),Rt()},mt,yt),st?(At(st),Ht(),ct=u.preferredFormat||tinycolor(st).format,gt(st)):Ht(),d&&xt();var r=zt?"mousedown.spectrum":"click.spectrum touchstart.spectrum";G.on(r,".sp-thumb-el",e),Q.on(r,".sp-thumb-el:nth-child(1)",{ignore:!0},e)}();var Nt={show:xt,hide:Ct,toggle:_t,reflow:Ot,option:function(t,e){return t===Et?jt.extend({},u):e===Et?u[t]:(u[t]=e,"preferredFormat"===t&&(ct=u.preferredFormat),void dt())},enable:function(){D=!1,E.attr("disabled",!1),ot.removeClass("sp-disabled")},disable:qt,offset:function(t){u.offset=t,Ot()},set:function(t){At(t),Tt()},get:Mt,destroy:function(){E.show(),ot.off("click.spectrum touchstart.spectrum"),I.remove(),nt.remove(),It[Nt.id]=null},container:I};return Nt.id=It.push(Nt)-1,Nt}function r(){}function $t(t){t.stopPropagation()}function Wt(t,e){var r=Array.prototype.slice,a=r.call(arguments,2);return function(){return t.apply(e,a.concat(r.call(arguments)))}}function Xt(i,s,e,t){s=s||function(){},e=e||function(){},t=t||function(){};var l=document,c=!1,f={},h=0,u=0,d="ontouchstart"in window,r={};function p(t){t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.returnValue=!1}function a(t){if(c){if(zt&&l.documentMode<9&&!t.button)return g();var e=t.originalEvent&&t.originalEvent.touches&&t.originalEvent.touches[0],r=e&&e.pageX||t.pageX,a=e&&e.pageY||t.pageY,n=Math.max(0,Math.min(r-f.left,u)),o=Math.max(0,Math.min(a-f.top,h));d&&p(t),s.apply(i,[n,o,t])}}function g(){c&&(jt(l).off(r),jt(l.body).removeClass("sp-dragging"),setTimeout(function(){t.apply(i,arguments)},0)),c=!1}r.selectstart=p,r.dragstart=p,r["touchmove mousemove"]=a,r["touchend mouseup"]=g,jt(i).on("touchstart mousedown",function(t){(t.which?3==t.which:2==t.button)||c||!1!==e.apply(i,arguments)&&(c=!0,h=jt(i).height(),u=jt(i).width(),f=jt(i).offset(),jt(l).on(r),jt(l.body).addClass("sp-dragging"),a(t),p(t))})}function Yt(){return jt.fn.spectrum.inputTypeColorSupport()}var i="spectrum.id";jt.fn.spectrum=function(r,t){if("string"!=typeof r)return this.spectrum("destroy").each(function(){var t=o(this,jt.extend({},jt(this).data(),r));jt(this).data(i,t.id)});var a=this,n=Array.prototype.slice.call(arguments,1);return this.each(function(){var t=It[jt(this).data(i)];if(t){var e=t[r];if(!e)throw new Error("Spectrum: no such method: '"+r+"'");"get"==r?a=t.get():"container"==r?a=t.container:"option"==r?a=t.option.apply(t,n):"destroy"==r?(t.destroy(),jt(this).removeData(i)):e.apply(t,n)}}),a},jt.fn.spectrum.load=!0,jt.fn.spectrum.loadOpts={},jt.fn.spectrum.draggable=Xt,jt.fn.spectrum.defaults=Dt,jt.fn.spectrum.inputTypeColorSupport=function t(){var e;return void 0===t._cachedResult&&(e=jt("<input type='color'/>")[0],t._cachedResult="color"===e.type&&""!==e.value),t._cachedResult},jt.spectrum={},jt.spectrum.localization={},jt.spectrum.palettes={},jt.fn.spectrum.processNativeColorInputs=function(){var t=jt("input[type=color]");t.length&&!Yt()&&t.spectrum({preferredFormat:"hex6"})},function(){var o=/^[\s,#]+/,i=/\s+$/,a=0,c=Math,s=c.round,f=c.min,h=c.max,t=c.random,u=function(t,e){if(e=e||{},(t=t||"")instanceof u)return t;if(!(this instanceof u))return new u(t,e);var r=function(t){var e={r:0,g:0,b:0},r=1,a=!1,n=!1;"string"==typeof t&&(t=function(t){t=t.replace(o,"").replace(i,"").toLowerCase();var e,r=!1;if(P[t])t=P[t],r=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};if(e=E.rgb.exec(t))return{r:e[1],g:e[2],b:e[3]};if(e=E.rgba.exec(t))return{r:e[1],g:e[2],b:e[3],a:e[4]};if(e=E.hsl.exec(t))return{h:e[1],s:e[2],l:e[3]};if(e=E.hsla.exec(t))return{h:e[1],s:e[2],l:e[3],a:e[4]};if(e=E.hsv.exec(t))return{h:e[1],s:e[2],v:e[3]};if(e=E.hsva.exec(t))return{h:e[1],s:e[2],v:e[3],a:e[4]};if(e=E.hex8.exec(t))return{a:function(t){return F(t)/255}(e[1]),r:F(e[2]),g:F(e[3]),b:F(e[4]),format:r?"name":"hex8"};if(e=E.hex6.exec(t))return{r:F(e[1]),g:F(e[2]),b:F(e[3]),format:r?"name":"hex"};if(e=E.hex3.exec(t))return{r:F(e[1]+""+e[1]),g:F(e[2]+""+e[2]),b:F(e[3]+""+e[3]),format:r?"name":"hex"};return!1}(t));"object"==typeof t&&(t.hasOwnProperty("r")&&t.hasOwnProperty("g")&&t.hasOwnProperty("b")?(e=function(t,e,r){return{r:255*R(t,255),g:255*R(e,255),b:255*R(r,255)}}(t.r,t.g,t.b),a=!0,n="%"===String(t.r).substr(-1)?"prgb":"rgb"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("v")?(t.s=O(t.s),t.v=O(t.v),e=function(t,e,r){t=6*R(t,360),e=R(e,100),r=R(r,100);var a=c.floor(t),n=t-a,o=r*(1-e),i=r*(1-n*e),s=r*(1-(1-n)*e),l=a%6;return{r:255*[r,i,o,o,s,r][l],g:255*[s,r,r,i,o,o][l],b:255*[o,o,s,r,r,i][l]}}(t.h,t.s,t.v),a=!0,n="hsv"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("l")&&(t.s=O(t.s),t.l=O(t.l),e=function(t,e,r){var a,n,o;function i(t,e,r){return r<0&&(r+=1),1<r&&--r,r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}{var s,l;t=R(t,360),e=R(e,100),r=R(r,100),0===e?a=n=o=r:(a=i(l=2*r-(s=r<.5?r*(1+e):r+e-r*e),s,t+1/3),n=i(l,s,t),o=i(l,s,t-1/3))}return{r:255*a,g:255*n,b:255*o}}(t.h,t.s,t.l),a=!0,n="hsl"),t.hasOwnProperty("a")&&(r=t.a));return r=M(r),{ok:a,format:t.format||n,r:f(255,h(e.r,0)),g:f(255,h(e.g,0)),b:f(255,h(e.b,0)),a:r}}(t);this._originalInput=t,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=s(1e3*this._a)/1e3,this._format=e.format||r.format,this._gradientType=e.gradientType,this._r<1&&(this._r=s(this._r)),this._g<1&&(this._g=s(this._g)),this._b<1&&(this._b=s(this._b)),this._ok=r.ok,this._tc_id=a++};function n(t,e,r){t=R(t,255),e=R(e,255),r=R(r,255);var a,n=h(t,e,r),o=f(t,e,r),i=(n+o)/2;if(n==o)a=l=0;else{var s=n-o,l=.5<i?s/(2-n-o):s/(n+o);switch(n){case t:a=(e-r)/s+(e<r?6:0);break;case e:a=(r-t)/s+2;break;case r:a=(t-e)/s+4}a/=6}return{h:a,s:l,l:i}}function l(t,e,r){t=R(t,255),e=R(e,255),r=R(r,255);var a,n=h(t,e,r),o=f(t,e,r),i=n,s=n-o,l=0===n?0:s/n;if(n==o)a=0;else{switch(n){case t:a=(e-r)/s+(e<r?6:0);break;case e:a=(r-t)/s+2;break;case r:a=(t-e)/s+4}a/=6}return{h:a,s:l,v:i}}function e(t,e,r,a){var n=[T(s(t).toString(16)),T(s(e).toString(16)),T(s(r).toString(16))];return a&&n[0].charAt(0)==n[0].charAt(1)&&n[1].charAt(0)==n[1].charAt(1)&&n[2].charAt(0)==n[2].charAt(1)?n[0].charAt(0)+n[1].charAt(0)+n[2].charAt(0):n.join("")}function d(t,e,r,a){var n;return[T((n=a,Math.round(255*parseFloat(n)).toString(16))),T(s(t).toString(16)),T(s(e).toString(16)),T(s(r).toString(16))].join("")}function r(t,e){e=0===e?0:e||10;var r=u(t).toHsl();return r.s-=e/100,r.s=H(r.s),u(r)}function p(t,e){e=0===e?0:e||10;var r=u(t).toHsl();return r.s+=e/100,r.s=H(r.s),u(r)}function g(t){return u(t).desaturate(100)}function b(t,e){e=0===e?0:e||10;var r=u(t).toHsl();return r.l+=e/100,r.l=H(r.l),u(r)}function v(t,e){e=0===e?0:e||10;var r=u(t).toRgb();return r.r=h(0,f(255,r.r-s(-e/100*255))),r.g=h(0,f(255,r.g-s(-e/100*255))),r.b=h(0,f(255,r.b-s(-e/100*255))),u(r)}function m(t,e){e=0===e?0:e||10;var r=u(t).toHsl();return r.l-=e/100,r.l=H(r.l),u(r)}function y(t,e){var r=u(t).toHsl(),a=(s(r.h)+e)%360;return r.h=a<0?360+a:a,u(r)}function w(t){var e=u(t).toHsl();return e.h=(e.h+180)%360,u(e)}function _(t){var e=u(t).toHsl(),r=e.h;return[u(t),u({h:(r+120)%360,s:e.s,l:e.l}),u({h:(r+240)%360,s:e.s,l:e.l})]}function x(t){var e=u(t).toHsl(),r=e.h;return[u(t),u({h:(r+90)%360,s:e.s,l:e.l}),u({h:(r+180)%360,s:e.s,l:e.l}),u({h:(r+270)%360,s:e.s,l:e.l})]}function k(t){var e=u(t).toHsl(),r=e.h;return[u(t),u({h:(r+72)%360,s:e.s,l:e.l}),u({h:(r+216)%360,s:e.s,l:e.l})]}function S(t,e,r){e=e||6,r=r||30;var a=u(t).toHsl(),n=360/r,o=[u(t)];for(a.h=(a.h-(n*e>>1)+720)%360;--e;)a.h=(a.h+n)%360,o.push(u(a));return o}function C(t,e){e=e||6;for(var r=u(t).toHsv(),a=r.h,n=r.s,o=r.v,i=[],s=1/e;e--;)i.push(u({h:a,s:n,v:o})),o=(o+s)%1;return i}u.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},setAlpha:function(t){return this._a=M(t),this._roundA=s(1e3*this._a)/1e3,this},toHsv:function(){var t=l(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=l(this._r,this._g,this._b),e=s(360*t.h),r=s(100*t.s),a=s(100*t.v);return 1==this._a?"hsv("+e+", "+r+"%, "+a+"%)":"hsva("+e+", "+r+"%, "+a+"%, "+this._roundA+")"},toHsl:function(){var t=n(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=n(this._r,this._g,this._b),e=s(360*t.h),r=s(100*t.s),a=s(100*t.l);return 1==this._a?"hsl("+e+", "+r+"%, "+a+"%)":"hsla("+e+", "+r+"%, "+a+"%, "+this._roundA+")"},toHex:function(t){return e(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(){return d(this._r,this._g,this._b,this._a)},toHex8String:function(){return"#"+this.toHex8()},toRgb:function(){return{r:s(this._r),g:s(this._g),b:s(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+s(this._r)+", "+s(this._g)+", "+s(this._b)+")":"rgba("+s(this._r)+", "+s(this._g)+", "+s(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:s(100*R(this._r,255))+"%",g:s(100*R(this._g,255))+"%",b:s(100*R(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+s(100*R(this._r,255))+"%, "+s(100*R(this._g,255))+"%, "+s(100*R(this._b,255))+"%)":"rgba("+s(100*R(this._r,255))+"%, "+s(100*R(this._g,255))+"%, "+s(100*R(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&A[e(this._r,this._g,this._b,!0)]||!1},toFilter:function(t){var e="#"+d(this._r,this._g,this._b,this._a),r=e,a=this._gradientType?"GradientType = 1, ":"";return t&&(r=u(t).toHex8String()),"progid:DXImageTransform.Microsoft.gradient("+a+"startColorstr="+e+",endColorstr="+r+")"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,a=this._a<1&&0<=this._a;return e||!a||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"name"!==t?("rgb"===t&&(r=this.toRgbString()),"prgb"===t&&(r=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(r=this.toHexString()),"hex3"===t&&(r=this.toHexString(!0)),"hex8"===t&&(r=this.toHex8String()),"name"===t&&(r=this.toName()),"hsl"===t&&(r=this.toHslString()),"hsv"===t&&(r=this.toHsvString()),r||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(b,arguments)},brighten:function(){return this._applyModification(v,arguments)},darken:function(){return this._applyModification(m,arguments)},desaturate:function(){return this._applyModification(r,arguments)},saturate:function(){return this._applyModification(p,arguments)},greyscale:function(){return this._applyModification(g,arguments)},spin:function(){return this._applyModification(y,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(S,arguments)},complement:function(){return this._applyCombination(w,arguments)},monochromatic:function(){return this._applyCombination(C,arguments)},splitcomplement:function(){return this._applyCombination(k,arguments)},triad:function(){return this._applyCombination(_,arguments)},tetrad:function(){return this._applyCombination(x,arguments)}},u.fromRatio=function(t,e){if("object"==typeof t){var r={};for(var a in t)t.hasOwnProperty(a)&&(r[a]="a"===a?t[a]:O(t[a]));t=r}return u(t,e)},u.equals=function(t,e){return!(!t||!e)&&u(t).toRgbString()==u(e).toRgbString()},u.random=function(){return u.fromRatio({r:t(),g:t(),b:t()})},u.mix=function(t,e,r){r=0===r?0:r||50;var a=u(t).toRgb(),n=u(e).toRgb(),o=r/100,i=2*o-1,s=n.a-a.a,l=i*s==-1?i:(i+s)/(1+i*s),c=1-(l=(l+1)/2),f={r:n.r*l+a.r*c,g:n.g*l+a.g*c,b:n.b*l+a.b*c,a:n.a*o+a.a*(1-o)};return u(f)},u.readability=function(t,e){var r=u(t),a=u(e),n=r.toRgb(),o=a.toRgb(),i=r.getBrightness(),s=a.getBrightness(),l=Math.max(n.r,o.r)-Math.min(n.r,o.r)+Math.max(n.g,o.g)-Math.min(n.g,o.g)+Math.max(n.b,o.b)-Math.min(n.b,o.b);return{brightness:Math.abs(i-s),color:l}},u.isReadable=function(t,e){var r=u.readability(t,e);return 125<r.brightness&&500<r.color},u.mostReadable=function(t,e){for(var r=null,a=0,n=!1,o=0;o<e.length;o++){var i=u.readability(t,e[o]),s=125<i.brightness&&500<i.color,l=i.brightness/125*3+i.color/500;(s&&!n||s&&n&&a<l||!s&&!n&&a<l)&&(n=s,a=l,r=u(e[o]))}return r};var P=u.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",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:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",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",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",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:"f00",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:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},A=u.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(P);function M(t){return t=parseFloat(t),(isNaN(t)||t<0||1<t)&&(t=1),t}function R(t,e){var r;"string"==typeof(r=t)&&-1!=r.indexOf(".")&&1===parseFloat(r)&&(t="100%");var a,n="string"==typeof(a=t)&&-1!=a.indexOf("%");return t=f(e,h(0,parseFloat(t))),n&&(t=parseInt(t*e,10)/100),c.abs(t-e)<1e-6?1:t%e/parseFloat(e)}function H(t){return f(1,h(0,t))}function F(t){return parseInt(t,16)}function T(t){return 1==t.length?"0"+t:""+t}function O(t){return t<=1&&(t=100*t+"%"),t}var q,N,j,E=(N="[\\s|\\(]+("+(q="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+q+")[,|\\s]+("+q+")\\s*\\)?",j="[\\s|\\(]+("+q+")[,|\\s]+("+q+")[,|\\s]+("+q+")[,|\\s]+("+q+")\\s*\\)?",{rgb:new RegExp("rgb"+N),rgba:new RegExp("rgba"+j),hsl:new RegExp("hsl"+N),hsla:new RegExp("hsla"+j),hsv:new RegExp("hsv"+N),hsva:new RegExp("hsva"+j),hex3:/^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex8:/^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});window.tinycolor=u}(),jt(function(){jt.fn.spectrum.load&&jt.fn.spectrum.processNativeColorInputs()})});
|
@@ -1,114 +1,136 @@
|
|
1
|
-
// Spectrum Colorpicker v1.
|
1
|
+
// Spectrum Colorpicker v1.8.1
|
2
2
|
// https://github.com/bgrins/spectrum
|
3
3
|
// Author: Brian Grinstead
|
4
4
|
// License: MIT
|
5
5
|
|
6
|
-
(function (
|
6
|
+
(function (factory) {
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
if (typeof define === 'function' && define.amd) { // AMD
|
10
|
+
define(['jquery'], factory);
|
11
|
+
}
|
12
|
+
else if (typeof exports == "object" && typeof module == "object") { // CommonJS
|
13
|
+
module.exports = factory(require('jquery'));
|
14
|
+
}
|
15
|
+
else { // Browser
|
16
|
+
factory(jQuery);
|
17
|
+
}
|
18
|
+
})(function($, undefined) {
|
19
|
+
"use strict";
|
20
|
+
|
7
21
|
var defaultOpts = {
|
8
22
|
|
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
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
23
|
+
// Callbacks
|
24
|
+
beforeShow: noop,
|
25
|
+
move: noop,
|
26
|
+
change: noop,
|
27
|
+
show: noop,
|
28
|
+
hide: noop,
|
29
|
+
|
30
|
+
// Options
|
31
|
+
color: false,
|
32
|
+
flat: false,
|
33
|
+
showInput: false,
|
34
|
+
allowEmpty: false,
|
35
|
+
showButtons: true,
|
36
|
+
clickoutFiresChange: true,
|
37
|
+
showInitial: false,
|
38
|
+
showPalette: false,
|
39
|
+
showPaletteOnly: false,
|
40
|
+
hideAfterPaletteSelect: false,
|
41
|
+
togglePaletteOnly: false,
|
42
|
+
showSelectionPalette: true,
|
43
|
+
localStorageKey: false,
|
44
|
+
appendTo: "body",
|
45
|
+
maxSelectionSize: 7,
|
46
|
+
cancelText: "cancel",
|
47
|
+
chooseText: "choose",
|
48
|
+
togglePaletteMoreText: "more",
|
49
|
+
togglePaletteLessText: "less",
|
50
|
+
clearText: "Clear Color Selection",
|
51
|
+
noColorSelectedText: "No Color Selected",
|
52
|
+
preferredFormat: false,
|
53
|
+
className: "", // Deprecated - use containerClassName and replacerClassName instead.
|
54
|
+
containerClassName: "",
|
55
|
+
replacerClassName: "",
|
56
|
+
showAlpha: false,
|
57
|
+
theme: "sp-light",
|
58
|
+
palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]],
|
59
|
+
selectionPalette: [],
|
60
|
+
disabled: false,
|
61
|
+
offset: null
|
62
|
+
},
|
63
|
+
spectrums = [],
|
64
|
+
IE = !!/msie/i.exec( window.navigator.userAgent ),
|
65
|
+
rgbaSupport = (function() {
|
66
|
+
function contains( str, substr ) {
|
67
|
+
return !!~('' + str).indexOf(substr);
|
68
|
+
}
|
69
|
+
|
70
|
+
var elem = document.createElement('div');
|
71
|
+
var style = elem.style;
|
72
|
+
style.cssText = 'background-color:rgba(0,0,0,.5)';
|
73
|
+
return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');
|
74
|
+
})(),
|
75
|
+
replaceInput = [
|
76
|
+
"<div class='sp-replacer'>",
|
58
77
|
"<div class='sp-preview'><div class='sp-preview-inner'></div></div>",
|
59
78
|
"<div class='sp-dd'>▼</div>",
|
60
|
-
|
61
|
-
|
62
|
-
|
79
|
+
"</div>"
|
80
|
+
].join(''),
|
81
|
+
markup = (function () {
|
63
82
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
}
|
83
|
+
// IE does not support gradients with multiple stops, so we need to simulate
|
84
|
+
// that for the rainbow slider with 8 divs that each have a single gradient
|
85
|
+
var gradientFix = "";
|
86
|
+
if (IE) {
|
87
|
+
for (var i = 1; i <= 6; i++) {
|
88
|
+
gradientFix += "<div class='sp-" + i + "'></div>";
|
71
89
|
}
|
90
|
+
}
|
72
91
|
|
73
|
-
|
74
|
-
|
92
|
+
return [
|
93
|
+
"<div class='sp-container sp-hidden'>",
|
75
94
|
"<div class='sp-palette-container'>",
|
76
|
-
|
95
|
+
"<div class='sp-palette sp-thumb sp-cf'></div>",
|
96
|
+
"<div class='sp-palette-button-container sp-cf'>",
|
97
|
+
"<button type='button' class='sp-palette-toggle'></button>",
|
98
|
+
"</div>",
|
77
99
|
"</div>",
|
78
100
|
"<div class='sp-picker-container'>",
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
101
|
+
"<div class='sp-top sp-cf'>",
|
102
|
+
"<div class='sp-fill'></div>",
|
103
|
+
"<div class='sp-top-inner'>",
|
104
|
+
"<div class='sp-color'>",
|
105
|
+
"<div class='sp-sat'>",
|
106
|
+
"<div class='sp-val'>",
|
107
|
+
"<div class='sp-dragger'></div>",
|
108
|
+
"</div>",
|
109
|
+
"</div>",
|
110
|
+
"</div>",
|
111
|
+
"<div class='sp-clear sp-clear-display'>",
|
112
|
+
"</div>",
|
113
|
+
"<div class='sp-hue'>",
|
114
|
+
"<div class='sp-slider'></div>",
|
115
|
+
gradientFix,
|
116
|
+
"</div>",
|
117
|
+
"</div>",
|
118
|
+
"<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
|
119
|
+
"</div>",
|
120
|
+
"<div class='sp-input-container sp-cf'>",
|
121
|
+
"<input class='sp-input' type='text' spellcheck='false' />",
|
122
|
+
"</div>",
|
123
|
+
"<div class='sp-initial sp-thumb sp-cf'></div>",
|
124
|
+
"<div class='sp-button-container sp-cf'>",
|
125
|
+
"<a class='sp-cancel' href='#'></a>",
|
126
|
+
"<button type='button' class='sp-choose'></button>",
|
127
|
+
"</div>",
|
87
128
|
"</div>",
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
"<div class='sp-hue'>",
|
92
|
-
"<div class='sp-slider'></div>",
|
93
|
-
gradientFix,
|
94
|
-
"</div>",
|
95
|
-
"</div>",
|
96
|
-
"<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
|
97
|
-
"</div>",
|
98
|
-
"<div class='sp-input-container sp-cf'>",
|
99
|
-
"<input class='sp-input' type='text' spellcheck='false' />",
|
100
|
-
"</div>",
|
101
|
-
"<div class='sp-initial sp-thumb sp-cf'></div>",
|
102
|
-
"<div class='sp-button-container sp-cf'>",
|
103
|
-
"<a class='sp-cancel' href='#'></a>",
|
104
|
-
"<button class='sp-choose'></button>",
|
105
|
-
"</div>",
|
106
|
-
"</div>",
|
107
|
-
"</div>"
|
108
|
-
].join("");
|
109
|
-
})();
|
129
|
+
"</div>"
|
130
|
+
].join("");
|
131
|
+
})();
|
110
132
|
|
111
|
-
function paletteTemplate (p, color, className) {
|
133
|
+
function paletteTemplate (p, color, className, opts) {
|
112
134
|
var html = [];
|
113
135
|
for (var i = 0; i < p.length; i++) {
|
114
136
|
var current = p[i];
|
@@ -116,12 +138,17 @@
|
|
116
138
|
var tiny = tinycolor(current);
|
117
139
|
var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light";
|
118
140
|
c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : "";
|
119
|
-
|
141
|
+
var formattedString = tiny.toString(opts.preferredFormat || "rgb");
|
120
142
|
var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter();
|
121
|
-
html.push('<span title="' +
|
143
|
+
html.push('<span title="' + formattedString + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';"></span></span>');
|
122
144
|
} else {
|
123
145
|
var cls = 'sp-clear-display';
|
124
|
-
html.push('<
|
146
|
+
html.push($('<div />')
|
147
|
+
.append($('<span data-color="" style="background-color:transparent;" class="' + cls + '"></span>')
|
148
|
+
.attr('title', opts.noColorSelectedText)
|
149
|
+
)
|
150
|
+
.html()
|
151
|
+
);
|
125
152
|
}
|
126
153
|
}
|
127
154
|
return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>";
|
@@ -158,6 +185,7 @@
|
|
158
185
|
callbacks = opts.callbacks,
|
159
186
|
resize = throttle(reflow, 10),
|
160
187
|
visible = false,
|
188
|
+
isDragging = false,
|
161
189
|
dragWidth = 0,
|
162
190
|
dragHeight = 0,
|
163
191
|
dragHelperHeight = 0,
|
@@ -170,8 +198,9 @@
|
|
170
198
|
currentSaturation = 0,
|
171
199
|
currentValue = 0,
|
172
200
|
currentAlpha = 1,
|
173
|
-
palette =
|
174
|
-
paletteArray =
|
201
|
+
palette = [],
|
202
|
+
paletteArray = [],
|
203
|
+
paletteLookup = {},
|
175
204
|
selectionPalette = opts.selectionPalette.slice(0),
|
176
205
|
maxSelectionSize = opts.maxSelectionSize,
|
177
206
|
draggingClass = "sp-dragging",
|
@@ -182,6 +211,7 @@
|
|
182
211
|
boundElement = $(element),
|
183
212
|
disabled = false,
|
184
213
|
container = $(markup, doc).addClass(theme),
|
214
|
+
pickerContainer = container.find(".sp-picker-container"),
|
185
215
|
dragger = container.find(".sp-color"),
|
186
216
|
dragHelper = container.find(".sp-dragger"),
|
187
217
|
slider = container.find(".sp-hue"),
|
@@ -195,16 +225,16 @@
|
|
195
225
|
cancelButton = container.find(".sp-cancel"),
|
196
226
|
clearButton = container.find(".sp-clear"),
|
197
227
|
chooseButton = container.find(".sp-choose"),
|
228
|
+
toggleButton = container.find(".sp-palette-toggle"),
|
198
229
|
isInput = boundElement.is("input"),
|
199
|
-
isInputTypeColor = isInput &&
|
230
|
+
isInputTypeColor = isInput && boundElement.attr("type") === "color" && inputTypeColorSupport(),
|
200
231
|
shouldReplace = isInput && !flat,
|
201
|
-
replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className) : $([]),
|
232
|
+
replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]),
|
202
233
|
offsetElement = (shouldReplace) ? replacer : boundElement,
|
203
234
|
previewElement = replacer.find(".sp-preview-inner"),
|
204
235
|
initialColor = opts.color || (isInput && boundElement.val()),
|
205
236
|
colorOnShow = false,
|
206
|
-
|
207
|
-
currentPreferredFormat = preferredFormat,
|
237
|
+
currentPreferredFormat = opts.preferredFormat,
|
208
238
|
clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange,
|
209
239
|
isEmpty = !initialColor,
|
210
240
|
allowEmpty = opts.allowEmpty && !isInputTypeColor;
|
@@ -215,15 +245,30 @@
|
|
215
245
|
opts.showPalette = true;
|
216
246
|
}
|
217
247
|
|
248
|
+
toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
|
249
|
+
|
250
|
+
if (opts.palette) {
|
251
|
+
palette = opts.palette.slice(0);
|
252
|
+
paletteArray = $.isArray(palette[0]) ? palette : [palette];
|
253
|
+
paletteLookup = {};
|
254
|
+
for (var i = 0; i < paletteArray.length; i++) {
|
255
|
+
for (var j = 0; j < paletteArray[i].length; j++) {
|
256
|
+
var rgb = tinycolor(paletteArray[i][j]).toRgbString();
|
257
|
+
paletteLookup[rgb] = true;
|
258
|
+
}
|
259
|
+
}
|
260
|
+
}
|
261
|
+
|
218
262
|
container.toggleClass("sp-flat", flat);
|
219
263
|
container.toggleClass("sp-input-disabled", !opts.showInput);
|
220
264
|
container.toggleClass("sp-alpha-enabled", opts.showAlpha);
|
221
265
|
container.toggleClass("sp-clear-enabled", allowEmpty);
|
222
266
|
container.toggleClass("sp-buttons-disabled", !opts.showButtons);
|
267
|
+
container.toggleClass("sp-palette-buttons-disabled", !opts.togglePaletteOnly);
|
223
268
|
container.toggleClass("sp-palette-disabled", !opts.showPalette);
|
224
269
|
container.toggleClass("sp-palette-only", opts.showPaletteOnly);
|
225
270
|
container.toggleClass("sp-initial-disabled", !opts.showInitial);
|
226
|
-
container.addClass(opts.className);
|
271
|
+
container.addClass(opts.className).addClass(opts.containerClassName);
|
227
272
|
|
228
273
|
reflow();
|
229
274
|
}
|
@@ -257,27 +302,9 @@
|
|
257
302
|
appendTo.append(container);
|
258
303
|
}
|
259
304
|
|
260
|
-
|
261
|
-
|
262
|
-
// Migrate old palettes over to new format. May want to remove this eventually.
|
263
|
-
try {
|
264
|
-
var oldPalette = window.localStorage[localStorageKey].split(",#");
|
265
|
-
if (oldPalette.length > 1) {
|
266
|
-
delete window.localStorage[localStorageKey];
|
267
|
-
$.each(oldPalette, function(i, c) {
|
268
|
-
addColorToSelectionPalette(c);
|
269
|
-
});
|
270
|
-
}
|
271
|
-
}
|
272
|
-
catch(e) { }
|
273
|
-
|
274
|
-
try {
|
275
|
-
selectionPalette = window.localStorage[localStorageKey].split(";");
|
276
|
-
}
|
277
|
-
catch (e) { }
|
278
|
-
}
|
305
|
+
updateSelectionPaletteFromStorage();
|
279
306
|
|
280
|
-
offsetElement.
|
307
|
+
offsetElement.on("click.spectrum touchstart.spectrum", function (e) {
|
281
308
|
if (!disabled) {
|
282
309
|
toggle();
|
283
310
|
}
|
@@ -298,44 +325,65 @@
|
|
298
325
|
|
299
326
|
// Handle user typed input
|
300
327
|
textInput.change(setFromTextInput);
|
301
|
-
textInput.
|
328
|
+
textInput.on("paste", function () {
|
302
329
|
setTimeout(setFromTextInput, 1);
|
303
330
|
});
|
304
331
|
textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });
|
305
332
|
|
306
333
|
cancelButton.text(opts.cancelText);
|
307
|
-
cancelButton.
|
334
|
+
cancelButton.on("click.spectrum", function (e) {
|
308
335
|
e.stopPropagation();
|
309
336
|
e.preventDefault();
|
310
|
-
|
337
|
+
revert();
|
338
|
+
hide();
|
311
339
|
});
|
312
340
|
|
313
|
-
|
314
|
-
clearButton.
|
341
|
+
clearButton.attr("title", opts.clearText);
|
342
|
+
clearButton.on("click.spectrum", function (e) {
|
315
343
|
e.stopPropagation();
|
316
344
|
e.preventDefault();
|
317
|
-
|
318
345
|
isEmpty = true;
|
319
|
-
|
320
346
|
move();
|
347
|
+
|
321
348
|
if(flat) {
|
322
349
|
//for the flat style, this is a change event
|
323
350
|
updateOriginalInput(true);
|
324
351
|
}
|
325
352
|
});
|
326
353
|
|
327
|
-
|
328
354
|
chooseButton.text(opts.chooseText);
|
329
|
-
chooseButton.
|
355
|
+
chooseButton.on("click.spectrum", function (e) {
|
330
356
|
e.stopPropagation();
|
331
357
|
e.preventDefault();
|
332
358
|
|
359
|
+
if (IE && textInput.is(":focus")) {
|
360
|
+
textInput.trigger('change');
|
361
|
+
}
|
362
|
+
|
333
363
|
if (isValid()) {
|
334
364
|
updateOriginalInput(true);
|
335
365
|
hide();
|
336
366
|
}
|
337
367
|
});
|
338
368
|
|
369
|
+
toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
|
370
|
+
toggleButton.on("click.spectrum", function (e) {
|
371
|
+
e.stopPropagation();
|
372
|
+
e.preventDefault();
|
373
|
+
|
374
|
+
opts.showPaletteOnly = !opts.showPaletteOnly;
|
375
|
+
|
376
|
+
// To make sure the Picker area is drawn on the right, next to the
|
377
|
+
// Palette area (and not below the palette), first move the Palette
|
378
|
+
// to the left to make space for the picker, plus 5px extra.
|
379
|
+
// The 'applyOptions' function puts the whole container back into place
|
380
|
+
// and takes care of the button-text and the sp-palette-only CSS class.
|
381
|
+
if (!opts.showPaletteOnly && !flat) {
|
382
|
+
container.css('left', '-=' + (pickerContainer.outerWidth(true) + 5));
|
383
|
+
}
|
384
|
+
applyOptions();
|
385
|
+
});
|
386
|
+
|
339
387
|
draggable(alphaSlider, function (dragX, dragY, e) {
|
340
388
|
currentAlpha = (dragX / alphaWidth);
|
341
389
|
isEmpty = false;
|
@@ -344,11 +392,14 @@
|
|
344
392
|
}
|
345
393
|
|
346
394
|
move();
|
347
|
-
});
|
395
|
+
}, dragStart, dragStop);
|
348
396
|
|
349
397
|
draggable(slider, function (dragX, dragY) {
|
350
398
|
currentHue = parseFloat(dragY / slideHeight);
|
351
399
|
isEmpty = false;
|
400
|
+
if (!opts.showAlpha) {
|
401
|
+
currentAlpha = 1;
|
402
|
+
}
|
352
403
|
move();
|
353
404
|
}, dragStart, dragStop);
|
354
405
|
|
@@ -377,6 +428,9 @@
|
|
377
428
|
}
|
378
429
|
|
379
430
|
isEmpty = false;
|
431
|
+
if (!opts.showAlpha) {
|
432
|
+
currentAlpha = 1;
|
433
|
+
}
|
380
434
|
|
381
435
|
move();
|
382
436
|
|
@@ -388,7 +442,7 @@
|
|
388
442
|
// In case color was black - update the preview UI and set the format
|
389
443
|
// since the set function will not run (default color is black).
|
390
444
|
updateUI();
|
391
|
-
currentPreferredFormat = preferredFormat || tinycolor(initialColor).format;
|
445
|
+
currentPreferredFormat = opts.preferredFormat || tinycolor(initialColor).format;
|
392
446
|
|
393
447
|
addColorToSelectionPalette(initialColor);
|
394
448
|
}
|
@@ -400,31 +454,61 @@
|
|
400
454
|
show();
|
401
455
|
}
|
402
456
|
|
403
|
-
function
|
457
|
+
function paletteElementClick(e) {
|
404
458
|
if (e.data && e.data.ignore) {
|
405
|
-
set($(
|
459
|
+
set($(e.target).closest(".sp-thumb-el").data("color"));
|
406
460
|
move();
|
407
461
|
}
|
408
462
|
else {
|
409
|
-
set($(
|
410
|
-
updateOriginalInput(true);
|
463
|
+
set($(e.target).closest(".sp-thumb-el").data("color"));
|
411
464
|
move();
|
412
|
-
|
465
|
+
|
466
|
+
// If the picker is going to close immediately, a palette selection
|
467
|
+
// is a change. Otherwise, it's a move only.
|
468
|
+
if (opts.hideAfterPaletteSelect) {
|
469
|
+
updateOriginalInput(true);
|
470
|
+
hide();
|
471
|
+
} else {
|
472
|
+
updateOriginalInput();
|
473
|
+
}
|
413
474
|
}
|
414
475
|
|
415
476
|
return false;
|
416
477
|
}
|
417
478
|
|
418
479
|
var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum";
|
419
|
-
paletteContainer.
|
420
|
-
initialColorContainer.
|
480
|
+
paletteContainer.on(paletteEvent, ".sp-thumb-el", paletteElementClick);
|
481
|
+
initialColorContainer.on(paletteEvent, ".sp-thumb-el:nth-child(1)", { ignore: true }, paletteElementClick);
|
482
|
+
}
|
483
|
+
|
484
|
+
function updateSelectionPaletteFromStorage() {
|
485
|
+
|
486
|
+
if (localStorageKey && window.localStorage) {
|
487
|
+
|
488
|
+
// Migrate old palettes over to new format. May want to remove this eventually.
|
489
|
+
try {
|
490
|
+
var oldPalette = window.localStorage[localStorageKey].split(",#");
|
491
|
+
if (oldPalette.length > 1) {
|
492
|
+
delete window.localStorage[localStorageKey];
|
493
|
+
$.each(oldPalette, function(i, c) {
|
494
|
+
addColorToSelectionPalette(c);
|
495
|
+
});
|
496
|
+
}
|
497
|
+
}
|
498
|
+
catch(e) { }
|
499
|
+
|
500
|
+
try {
|
501
|
+
selectionPalette = window.localStorage[localStorageKey].split(";");
|
502
|
+
}
|
503
|
+
catch (e) { }
|
504
|
+
}
|
421
505
|
}
|
422
506
|
|
423
507
|
function addColorToSelectionPalette(color) {
|
424
508
|
if (showSelectionPalette) {
|
425
|
-
var
|
426
|
-
if ($.inArray(
|
427
|
-
selectionPalette.push(
|
509
|
+
var rgb = tinycolor(color).toRgbString();
|
510
|
+
if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) {
|
511
|
+
selectionPalette.push(rgb);
|
428
512
|
while(selectionPalette.length > maxSelectionSize) {
|
429
513
|
selectionPalette.shift();
|
430
514
|
}
|
@@ -441,25 +525,12 @@
|
|
441
525
|
|
442
526
|
function getUniqueSelectionPalette() {
|
443
527
|
var unique = [];
|
444
|
-
var p = selectionPalette;
|
445
|
-
var paletteLookup = {};
|
446
|
-
var rgb;
|
447
|
-
|
448
528
|
if (opts.showPalette) {
|
529
|
+
for (var i = 0; i < selectionPalette.length; i++) {
|
530
|
+
var rgb = tinycolor(selectionPalette[i]).toRgbString();
|
449
531
|
|
450
|
-
|
451
|
-
|
452
|
-
rgb = tinycolor(paletteArray[i][j]).toRgbString();
|
453
|
-
paletteLookup[rgb] = true;
|
454
|
-
}
|
455
|
-
}
|
456
|
-
|
457
|
-
for (i = 0; i < p.length; i++) {
|
458
|
-
rgb = tinycolor(p[i]).toRgbString();
|
459
|
-
|
460
|
-
if (!paletteLookup.hasOwnProperty(rgb)) {
|
461
|
-
unique.push(p[i]);
|
462
|
-
paletteLookup[rgb] = true;
|
532
|
+
if (!paletteLookup[rgb]) {
|
533
|
+
unique.push(selectionPalette[i]);
|
463
534
|
}
|
464
535
|
}
|
465
536
|
}
|
@@ -472,11 +543,13 @@
|
|
472
543
|
var currentColor = get();
|
473
544
|
|
474
545
|
var html = $.map(paletteArray, function (palette, i) {
|
475
|
-
return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i);
|
546
|
+
return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts);
|
476
547
|
});
|
477
548
|
|
549
|
+
updateSelectionPaletteFromStorage();
|
550
|
+
|
478
551
|
if (selectionPalette) {
|
479
|
-
html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection"));
|
552
|
+
html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts));
|
480
553
|
}
|
481
554
|
|
482
555
|
paletteContainer.html(html.join(""));
|
@@ -486,7 +559,7 @@
|
|
486
559
|
if (opts.showInitial) {
|
487
560
|
var initial = colorOnShow;
|
488
561
|
var current = get();
|
489
|
-
initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial"));
|
562
|
+
initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts));
|
490
563
|
}
|
491
564
|
}
|
492
565
|
|
@@ -494,12 +567,16 @@
|
|
494
567
|
if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) {
|
495
568
|
reflow();
|
496
569
|
}
|
570
|
+
isDragging = true;
|
497
571
|
container.addClass(draggingClass);
|
498
572
|
shiftMovementDirection = null;
|
573
|
+
boundElement.trigger('dragstart.spectrum', [ get() ]);
|
499
574
|
}
|
500
575
|
|
501
576
|
function dragStop() {
|
577
|
+
isDragging = false;
|
502
578
|
container.removeClass(draggingClass);
|
579
|
+
boundElement.trigger('dragstop.spectrum', [ get() ]);
|
503
580
|
}
|
504
581
|
|
505
582
|
function setFromTextInput() {
|
@@ -508,11 +585,15 @@
|
|
508
585
|
|
509
586
|
if ((value === null || value === "") && allowEmpty) {
|
510
587
|
set(null);
|
588
|
+
move();
|
589
|
+
updateOriginalInput();
|
511
590
|
}
|
512
591
|
else {
|
513
592
|
var tiny = tinycolor(value);
|
514
|
-
if (tiny.
|
593
|
+
if (tiny.isValid()) {
|
515
594
|
set(tiny);
|
595
|
+
move();
|
596
|
+
updateOriginalInput();
|
516
597
|
}
|
517
598
|
else {
|
518
599
|
textInput.addClass("sp-validation-error");
|
@@ -546,14 +627,12 @@
|
|
546
627
|
hideAll();
|
547
628
|
visible = true;
|
548
629
|
|
549
|
-
$(doc).
|
550
|
-
$(
|
630
|
+
$(doc).on("keydown.spectrum", onkeydown);
|
631
|
+
$(doc).on("click.spectrum", clickout);
|
632
|
+
$(window).on("resize.spectrum", resize);
|
551
633
|
replacer.addClass("sp-active");
|
552
634
|
container.removeClass("sp-hidden");
|
553
635
|
|
554
|
-
if (opts.showPalette) {
|
555
|
-
drawPalette();
|
556
|
-
}
|
557
636
|
reflow();
|
558
637
|
updateUI();
|
559
638
|
|
@@ -564,52 +643,66 @@
|
|
564
643
|
boundElement.trigger('show.spectrum', [ colorOnShow ]);
|
565
644
|
}
|
566
645
|
|
567
|
-
function
|
646
|
+
function onkeydown(e) {
|
647
|
+
// Close on ESC
|
648
|
+
if (e.keyCode === 27) {
|
649
|
+
hide();
|
650
|
+
}
|
651
|
+
}
|
652
|
+
|
653
|
+
function clickout(e) {
|
654
|
+
// Return on right click.
|
655
|
+
if (e.button == 2) { return; }
|
656
|
+
|
657
|
+
// If a drag event was happening during the mouseup, don't hide
|
658
|
+
// on click.
|
659
|
+
if (isDragging) { return; }
|
568
660
|
|
569
|
-
|
570
|
-
|
661
|
+
if (clickoutFiresChange) {
|
662
|
+
updateOriginalInput(true);
|
663
|
+
}
|
664
|
+
else {
|
665
|
+
revert();
|
666
|
+
}
|
667
|
+
hide();
|
668
|
+
}
|
571
669
|
|
670
|
+
function hide() {
|
572
671
|
// Return if hiding is unnecessary
|
573
672
|
if (!visible || flat) { return; }
|
574
673
|
visible = false;
|
575
674
|
|
576
|
-
$(doc).
|
577
|
-
$(
|
675
|
+
$(doc).off("keydown.spectrum", onkeydown);
|
676
|
+
$(doc).off("click.spectrum", clickout);
|
677
|
+
$(window).off("resize.spectrum", resize);
|
578
678
|
|
579
679
|
replacer.removeClass("sp-active");
|
580
680
|
container.addClass("sp-hidden");
|
581
681
|
|
582
|
-
var colorHasChanged = !tinycolor.equals(get(), colorOnShow);
|
583
|
-
|
584
|
-
if (colorHasChanged) {
|
585
|
-
if (clickoutFiresChange && e !== "cancel") {
|
586
|
-
updateOriginalInput(true);
|
587
|
-
}
|
588
|
-
else {
|
589
|
-
revert();
|
590
|
-
}
|
591
|
-
}
|
592
|
-
|
593
682
|
callbacks.hide(get());
|
594
683
|
boundElement.trigger('hide.spectrum', [ get() ]);
|
595
684
|
}
|
596
685
|
|
597
686
|
function revert() {
|
598
687
|
set(colorOnShow, true);
|
688
|
+
updateOriginalInput(true);
|
599
689
|
}
|
600
690
|
|
601
691
|
function set(color, ignoreFormatChange) {
|
602
692
|
if (tinycolor.equals(color, get())) {
|
693
|
+
// Update UI just in case a validation error needs
|
694
|
+
// to be cleared.
|
695
|
+
updateUI();
|
603
696
|
return;
|
604
697
|
}
|
605
698
|
|
606
|
-
var newColor;
|
699
|
+
var newColor, newHsv;
|
607
700
|
if (!color && allowEmpty) {
|
608
701
|
isEmpty = true;
|
609
702
|
} else {
|
610
703
|
isEmpty = false;
|
611
704
|
newColor = tinycolor(color);
|
612
|
-
|
705
|
+
newHsv = newColor.toHsv();
|
613
706
|
|
614
707
|
currentHue = (newHsv.h % 360) / 360;
|
615
708
|
currentSaturation = newHsv.s;
|
@@ -618,8 +711,8 @@
|
|
618
711
|
}
|
619
712
|
updateUI();
|
620
713
|
|
621
|
-
if (newColor && newColor.
|
622
|
-
currentPreferredFormat = preferredFormat || newColor.
|
714
|
+
if (newColor && newColor.isValid() && !ignoreFormatChange) {
|
715
|
+
currentPreferredFormat = opts.preferredFormat || newColor.getFormat();
|
623
716
|
}
|
624
717
|
}
|
625
718
|
|
@@ -634,7 +727,7 @@
|
|
634
727
|
h: currentHue,
|
635
728
|
s: currentSaturation,
|
636
729
|
v: currentValue,
|
637
|
-
a: Math.round(currentAlpha *
|
730
|
+
a: Math.round(currentAlpha * 1000) / 1000
|
638
731
|
}, { format: opts.format || currentPreferredFormat });
|
639
732
|
}
|
640
733
|
|
@@ -661,7 +754,7 @@
|
|
661
754
|
|
662
755
|
// Get a format that alpha will be included in (hex and names ignore alpha)
|
663
756
|
var format = currentPreferredFormat;
|
664
|
-
if (currentAlpha < 1) {
|
757
|
+
if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) {
|
665
758
|
if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") {
|
666
759
|
format = "rgb";
|
667
760
|
}
|
@@ -670,7 +763,7 @@
|
|
670
763
|
var realColor = get({ format: format }),
|
671
764
|
displayColor = '';
|
672
765
|
|
673
|
-
|
766
|
+
//reset background info for preview element
|
674
767
|
previewElement.removeClass("sp-clear-display");
|
675
768
|
previewElement.css('background-color', 'transparent');
|
676
769
|
|
@@ -704,12 +797,15 @@
|
|
704
797
|
alphaSliderInner.css("background", "-webkit-" + gradient);
|
705
798
|
alphaSliderInner.css("background", "-moz-" + gradient);
|
706
799
|
alphaSliderInner.css("background", "-ms-" + gradient);
|
707
|
-
|
800
|
+
// Use current syntax gradient on unprefixed property.
|
801
|
+
alphaSliderInner.css("background",
|
802
|
+
"linear-gradient(to right, " + realAlpha + ", " + realHex + ")");
|
708
803
|
}
|
709
804
|
}
|
710
805
|
|
711
806
|
displayColor = realColor.toString(format);
|
712
807
|
}
|
808
|
+
|
713
809
|
// Update the text entry input as it changes happen
|
714
810
|
if (opts.showInput) {
|
715
811
|
textInput.val(displayColor);
|
@@ -750,19 +846,19 @@
|
|
750
846
|
Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)
|
751
847
|
);
|
752
848
|
dragHelper.css({
|
753
|
-
"top": dragY,
|
754
|
-
"left": dragX
|
849
|
+
"top": dragY + "px",
|
850
|
+
"left": dragX + "px"
|
755
851
|
});
|
756
852
|
|
757
853
|
var alphaX = currentAlpha * alphaWidth;
|
758
854
|
alphaSlideHelper.css({
|
759
|
-
"left": alphaX - (alphaSlideHelperWidth / 2)
|
855
|
+
"left": (alphaX - (alphaSlideHelperWidth / 2)) + "px"
|
760
856
|
});
|
761
857
|
|
762
858
|
// Where to show the bar that displays your current selected hue
|
763
859
|
var slideY = (currentHue) * slideHeight;
|
764
860
|
slideHelper.css({
|
765
|
-
"top": slideY - slideHelperHeight
|
861
|
+
"top": (slideY - slideHelperHeight) + "px"
|
766
862
|
});
|
767
863
|
}
|
768
864
|
}
|
@@ -772,7 +868,7 @@
|
|
772
868
|
displayColor = '',
|
773
869
|
hasChanged = !tinycolor.equals(color, colorOnShow);
|
774
870
|
|
775
|
-
if(color) {
|
871
|
+
if (color) {
|
776
872
|
displayColor = color.toString(currentPreferredFormat);
|
777
873
|
// Update the selection palette with the current color
|
778
874
|
addColorToSelectionPalette(color);
|
@@ -782,8 +878,6 @@
|
|
782
878
|
boundElement.val(displayColor);
|
783
879
|
}
|
784
880
|
|
785
|
-
colorOnShow = color;
|
786
|
-
|
787
881
|
if (fireCallback && hasChanged) {
|
788
882
|
callbacks.change(color);
|
789
883
|
boundElement.trigger('change', [ color ]);
|
@@ -791,6 +885,9 @@
|
|
791
885
|
}
|
792
886
|
|
793
887
|
function reflow() {
|
888
|
+
if (!visible) {
|
889
|
+
return; // Calculations would be useless and wouldn't be reliable anyways
|
890
|
+
}
|
794
891
|
dragWidth = dragger.width();
|
795
892
|
dragHeight = dragger.height();
|
796
893
|
dragHelperHeight = dragHelper.height();
|
@@ -802,15 +899,25 @@
|
|
802
899
|
|
803
900
|
if (!flat) {
|
804
901
|
container.css("position", "absolute");
|
805
|
-
|
902
|
+
if (opts.offset) {
|
903
|
+
container.offset(opts.offset);
|
904
|
+
} else {
|
905
|
+
container.offset(getOffset(container, offsetElement));
|
906
|
+
}
|
806
907
|
}
|
807
908
|
|
808
909
|
updateHelperLocations();
|
910
|
+
|
911
|
+
if (opts.showPalette) {
|
912
|
+
drawPalette();
|
913
|
+
}
|
914
|
+
|
915
|
+
boundElement.trigger('reflow.spectrum');
|
809
916
|
}
|
810
917
|
|
811
918
|
function destroy() {
|
812
919
|
boundElement.show();
|
813
|
-
offsetElement.
|
920
|
+
offsetElement.off("click.spectrum touchstart.spectrum");
|
814
921
|
container.remove();
|
815
922
|
replacer.remove();
|
816
923
|
spectrums[spect.id] = null;
|
@@ -825,6 +932,10 @@
|
|
825
932
|
}
|
826
933
|
|
827
934
|
opts[optionName] = optionValue;
|
935
|
+
|
936
|
+
if (optionName === "preferredFormat") {
|
937
|
+
currentPreferredFormat = opts.preferredFormat;
|
938
|
+
}
|
828
939
|
applyOptions();
|
829
940
|
}
|
830
941
|
|
@@ -841,6 +952,11 @@
|
|
841
952
|
offsetElement.addClass("sp-disabled");
|
842
953
|
}
|
843
954
|
|
955
|
+
function setOffset(coord) {
|
956
|
+
opts.offset = coord;
|
957
|
+
reflow();
|
958
|
+
}
|
959
|
+
|
844
960
|
initialize();
|
845
961
|
|
846
962
|
var spect = {
|
@@ -851,6 +967,7 @@
|
|
851
967
|
option: option,
|
852
968
|
enable: enable,
|
853
969
|
disable: disable,
|
970
|
+
offset: setOffset,
|
854
971
|
set: function (c) {
|
855
972
|
set(c);
|
856
973
|
updateOriginalInput();
|
@@ -866,9 +983,9 @@
|
|
866
983
|
}
|
867
984
|
|
868
985
|
/**
|
869
|
-
|
870
|
-
|
871
|
-
|
986
|
+
* checkOffset - get the offset below/above and left/right element depending on screen position
|
987
|
+
* Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
|
988
|
+
*/
|
872
989
|
function getOffset(picker, input) {
|
873
990
|
var extraY = 0;
|
874
991
|
var dpWidth = picker.outerWidth();
|
@@ -879,37 +996,47 @@
|
|
879
996
|
var viewWidth = docElem.clientWidth + $(doc).scrollLeft();
|
880
997
|
var viewHeight = docElem.clientHeight + $(doc).scrollTop();
|
881
998
|
var offset = input.offset();
|
882
|
-
offset.
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
Math.
|
890
|
-
|
891
|
-
|
892
|
-
|
999
|
+
var offsetLeft = offset.left;
|
1000
|
+
var offsetTop = offset.top;
|
1001
|
+
|
1002
|
+
offsetTop += inputHeight;
|
1003
|
+
|
1004
|
+
offsetLeft -=
|
1005
|
+
Math.min(offsetLeft, (offsetLeft + dpWidth > viewWidth && viewWidth > dpWidth) ?
|
1006
|
+
Math.abs(offsetLeft + dpWidth - viewWidth) : 0);
|
1007
|
+
|
1008
|
+
offsetTop -=
|
1009
|
+
Math.min(offsetTop, ((offsetTop + dpHeight > viewHeight && viewHeight > dpHeight) ?
|
1010
|
+
Math.abs(dpHeight + inputHeight - extraY) : extraY));
|
1011
|
+
|
1012
|
+
return {
|
1013
|
+
top: offsetTop,
|
1014
|
+
bottom: offset.bottom,
|
1015
|
+
left: offsetLeft,
|
1016
|
+
right: offset.right,
|
1017
|
+
width: offset.width,
|
1018
|
+
height: offset.height
|
1019
|
+
};
|
893
1020
|
}
|
894
1021
|
|
895
1022
|
/**
|
896
|
-
|
897
|
-
|
1023
|
+
* noop - do nothing
|
1024
|
+
*/
|
898
1025
|
function noop() {
|
899
1026
|
|
900
1027
|
}
|
901
1028
|
|
902
1029
|
/**
|
903
|
-
|
904
|
-
|
1030
|
+
* stopPropagation - makes the code only doing this a little easier to read in line
|
1031
|
+
*/
|
905
1032
|
function stopPropagation(e) {
|
906
1033
|
e.stopPropagation();
|
907
1034
|
}
|
908
1035
|
|
909
1036
|
/**
|
910
|
-
|
911
|
-
|
912
|
-
|
1037
|
+
* Create a function bound to a given object
|
1038
|
+
* Thanks to underscore.js
|
1039
|
+
*/
|
913
1040
|
function bind(func, obj) {
|
914
1041
|
var slice = Array.prototype.slice;
|
915
1042
|
var args = slice.call(arguments, 2);
|
@@ -919,14 +1046,14 @@
|
|
919
1046
|
}
|
920
1047
|
|
921
1048
|
/**
|
922
|
-
|
923
|
-
|
924
|
-
|
1049
|
+
* Lightweight drag helper. Handles containment within the element, so that
|
1050
|
+
* when dragging, the x is within [0,element.width] and y is within [0,element.height]
|
1051
|
+
*/
|
925
1052
|
function draggable(element, onmove, onstart, onstop) {
|
926
1053
|
onmove = onmove || function () { };
|
927
1054
|
onstart = onstart || function () { };
|
928
1055
|
onstop = onstop || function () { };
|
929
|
-
var doc =
|
1056
|
+
var doc = document;
|
930
1057
|
var dragging = false;
|
931
1058
|
var offset = {};
|
932
1059
|
var maxHeight = 0;
|
@@ -952,13 +1079,13 @@
|
|
952
1079
|
function move(e) {
|
953
1080
|
if (dragging) {
|
954
1081
|
// Mouseup happened outside of window
|
955
|
-
if (IE &&
|
1082
|
+
if (IE && doc.documentMode < 9 && !e.button) {
|
956
1083
|
return stop();
|
957
1084
|
}
|
958
1085
|
|
959
|
-
var
|
960
|
-
var pageX =
|
961
|
-
var pageY =
|
1086
|
+
var t0 = e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0];
|
1087
|
+
var pageX = t0 && t0.pageX || e.pageX;
|
1088
|
+
var pageY = t0 && t0.pageY || e.pageY;
|
962
1089
|
|
963
1090
|
var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
|
964
1091
|
var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
|
@@ -971,9 +1098,9 @@
|
|
971
1098
|
onmove.apply(element, [dragX, dragY, e]);
|
972
1099
|
}
|
973
1100
|
}
|
1101
|
+
|
974
1102
|
function start(e) {
|
975
1103
|
var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
|
976
|
-
var touches = e.originalEvent.touches;
|
977
1104
|
|
978
1105
|
if (!rightclick && !dragging) {
|
979
1106
|
if (onstart.apply(element, arguments) !== false) {
|
@@ -982,27 +1109,31 @@
|
|
982
1109
|
maxWidth = $(element).width();
|
983
1110
|
offset = $(element).offset();
|
984
1111
|
|
985
|
-
$(doc).
|
1112
|
+
$(doc).on(duringDragEvents);
|
986
1113
|
$(doc.body).addClass("sp-dragging");
|
987
1114
|
|
988
|
-
|
989
|
-
move(e);
|
990
|
-
}
|
1115
|
+
move(e);
|
991
1116
|
|
992
1117
|
prevent(e);
|
993
1118
|
}
|
994
1119
|
}
|
995
1120
|
}
|
1121
|
+
|
996
1122
|
function stop() {
|
997
1123
|
if (dragging) {
|
998
|
-
$(doc).
|
1124
|
+
$(doc).off(duringDragEvents);
|
999
1125
|
$(doc.body).removeClass("sp-dragging");
|
1000
|
-
|
1126
|
+
|
1127
|
+
// Wait a tick before notifying observers to allow the click event
|
1128
|
+
// to fire in Chrome.
|
1129
|
+
setTimeout(function() {
|
1130
|
+
onstop.apply(element, arguments);
|
1131
|
+
}, 0);
|
1001
1132
|
}
|
1002
1133
|
dragging = false;
|
1003
1134
|
}
|
1004
1135
|
|
1005
|
-
$(element).
|
1136
|
+
$(element).on("touchstart mousedown", start);
|
1006
1137
|
}
|
1007
1138
|
|
1008
1139
|
function throttle(func, wait, debounce) {
|
@@ -1018,12 +1149,13 @@
|
|
1018
1149
|
};
|
1019
1150
|
}
|
1020
1151
|
|
1021
|
-
|
1022
|
-
|
1152
|
+
function inputTypeColorSupport() {
|
1153
|
+
return $.fn.spectrum.inputTypeColorSupport();
|
1154
|
+
}
|
1023
1155
|
|
1024
1156
|
/**
|
1025
|
-
|
1026
|
-
|
1157
|
+
* Define a jQuery plugin
|
1158
|
+
*/
|
1027
1159
|
var dataID = "spectrum.id";
|
1028
1160
|
$.fn.spectrum = function (opts, extra) {
|
1029
1161
|
|
@@ -1035,7 +1167,6 @@
|
|
1035
1167
|
this.each(function () {
|
1036
1168
|
var spect = spectrums[$(this).data(dataID)];
|
1037
1169
|
if (spect) {
|
1038
|
-
|
1039
1170
|
var method = spect[opts];
|
1040
1171
|
if (!method) {
|
1041
1172
|
throw new Error( "Spectrum: no such method: '" + opts + "'" );
|
@@ -1065,7 +1196,8 @@
|
|
1065
1196
|
|
1066
1197
|
// Initializing a new instance of spectrum
|
1067
1198
|
return this.spectrum("destroy").each(function () {
|
1068
|
-
var
|
1199
|
+
var options = $.extend({}, $(this).data(), opts);
|
1200
|
+
var spect = spectrum(this, options);
|
1069
1201
|
$(this).data(dataID, spect.id);
|
1070
1202
|
});
|
1071
1203
|
};
|
@@ -1074,937 +1206,1136 @@
|
|
1074
1206
|
$.fn.spectrum.loadOpts = {};
|
1075
1207
|
$.fn.spectrum.draggable = draggable;
|
1076
1208
|
$.fn.spectrum.defaults = defaultOpts;
|
1209
|
+
$.fn.spectrum.inputTypeColorSupport = function inputTypeColorSupport() {
|
1210
|
+
if (typeof inputTypeColorSupport._cachedResult === "undefined") {
|
1211
|
+
var colorInput = $("<input type='color'/>")[0]; // if color element is supported, value will default to not null
|
1212
|
+
inputTypeColorSupport._cachedResult = colorInput.type === "color" && colorInput.value !== "";
|
1213
|
+
}
|
1214
|
+
return inputTypeColorSupport._cachedResult;
|
1215
|
+
};
|
1077
1216
|
|
1078
1217
|
$.spectrum = { };
|
1079
1218
|
$.spectrum.localization = { };
|
1080
1219
|
$.spectrum.palettes = { };
|
1081
1220
|
|
1082
1221
|
$.fn.spectrum.processNativeColorInputs = function () {
|
1083
|
-
|
1084
|
-
|
1222
|
+
var colorInputs = $("input[type=color]");
|
1223
|
+
if (colorInputs.length && !inputTypeColorSupport()) {
|
1224
|
+
colorInputs.spectrum({
|
1085
1225
|
preferredFormat: "hex6"
|
1086
1226
|
});
|
1087
1227
|
}
|
1088
1228
|
};
|
1089
1229
|
|
1090
|
-
// TinyColor
|
1230
|
+
// TinyColor v1.1.2
|
1091
1231
|
// https://github.com/bgrins/TinyColor
|
1092
|
-
//
|
1232
|
+
// Brian Grinstead, MIT License
|
1093
1233
|
|
1094
1234
|
(function() {
|
1095
1235
|
|
1096
|
-
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1236
|
+
var trimLeft = /^[\s,#]+/,
|
1237
|
+
trimRight = /\s+$/,
|
1238
|
+
tinyCounter = 0,
|
1239
|
+
math = Math,
|
1240
|
+
mathRound = math.round,
|
1241
|
+
mathMin = math.min,
|
1242
|
+
mathMax = math.max,
|
1243
|
+
mathRandom = math.random;
|
1104
1244
|
|
1105
|
-
|
1245
|
+
var tinycolor = function(color, opts) {
|
1106
1246
|
|
1107
|
-
|
1108
|
-
|
1247
|
+
color = (color) ? color : '';
|
1248
|
+
opts = opts || { };
|
1109
1249
|
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1250
|
+
// If input is already a tinycolor, return itself
|
1251
|
+
if (color instanceof tinycolor) {
|
1252
|
+
return color;
|
1253
|
+
}
|
1254
|
+
// If we are called as a function, call using new instead
|
1255
|
+
if (!(this instanceof tinycolor)) {
|
1256
|
+
return new tinycolor(color, opts);
|
1257
|
+
}
|
1114
1258
|
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1259
|
+
var rgb = inputToRGB(color);
|
1260
|
+
this._originalInput = color;
|
1261
|
+
this._r = rgb.r;
|
1262
|
+
this._g = rgb.g;
|
1263
|
+
this._b = rgb.b;
|
1264
|
+
this._a = rgb.a;
|
1265
|
+
this._roundA = mathRound(1000 * this._a) / 1000;
|
1266
|
+
this._format = opts.format || rgb.format;
|
1267
|
+
this._gradientType = opts.gradientType;
|
1268
|
+
|
1269
|
+
// Don't let the range of [0,255] come back in [0,1].
|
1270
|
+
// Potentially lose a little bit of precision here, but will fix issues where
|
1271
|
+
// .5 gets interpreted as half of the total, instead of half of 1
|
1272
|
+
// If it was supposed to be 128, this was already taken care of by `inputToRgb`
|
1273
|
+
if (this._r < 1) { this._r = mathRound(this._r); }
|
1274
|
+
if (this._g < 1) { this._g = mathRound(this._g); }
|
1275
|
+
if (this._b < 1) { this._b = mathRound(this._b); }
|
1276
|
+
|
1277
|
+
this._ok = rgb.ok;
|
1278
|
+
this._tc_id = tinyCounter++;
|
1279
|
+
};
|
1122
1280
|
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1281
|
+
tinycolor.prototype = {
|
1282
|
+
isDark: function() {
|
1283
|
+
return this.getBrightness() < 128;
|
1284
|
+
},
|
1285
|
+
isLight: function() {
|
1286
|
+
return !this.isDark();
|
1287
|
+
},
|
1288
|
+
isValid: function() {
|
1289
|
+
return this._ok;
|
1290
|
+
},
|
1291
|
+
getOriginalInput: function() {
|
1292
|
+
return this._originalInput;
|
1293
|
+
},
|
1294
|
+
getFormat: function() {
|
1295
|
+
return this._format;
|
1296
|
+
},
|
1297
|
+
getAlpha: function() {
|
1298
|
+
return this._a;
|
1299
|
+
},
|
1300
|
+
getBrightness: function() {
|
1301
|
+
var rgb = this.toRgb();
|
1302
|
+
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
|
1303
|
+
},
|
1304
|
+
setAlpha: function(value) {
|
1305
|
+
this._a = boundAlpha(value);
|
1306
|
+
this._roundA = mathRound(1000 * this._a) / 1000;
|
1307
|
+
return this;
|
1308
|
+
},
|
1309
|
+
toHsv: function() {
|
1310
|
+
var hsv = rgbToHsv(this._r, this._g, this._b);
|
1311
|
+
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
|
1312
|
+
},
|
1313
|
+
toHsvString: function() {
|
1314
|
+
var hsv = rgbToHsv(this._r, this._g, this._b);
|
1315
|
+
var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
|
1316
|
+
return (this._a == 1) ?
|
1317
|
+
"hsv(" + h + ", " + s + "%, " + v + "%)" :
|
1318
|
+
"hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
|
1319
|
+
},
|
1320
|
+
toHsl: function() {
|
1321
|
+
var hsl = rgbToHsl(this._r, this._g, this._b);
|
1322
|
+
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
|
1323
|
+
},
|
1324
|
+
toHslString: function() {
|
1325
|
+
var hsl = rgbToHsl(this._r, this._g, this._b);
|
1326
|
+
var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
|
1327
|
+
return (this._a == 1) ?
|
1328
|
+
"hsl(" + h + ", " + s + "%, " + l + "%)" :
|
1329
|
+
"hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
|
1330
|
+
},
|
1331
|
+
toHex: function(allow3Char) {
|
1332
|
+
return rgbToHex(this._r, this._g, this._b, allow3Char);
|
1333
|
+
},
|
1334
|
+
toHexString: function(allow3Char) {
|
1335
|
+
return '#' + this.toHex(allow3Char);
|
1336
|
+
},
|
1337
|
+
toHex8: function() {
|
1338
|
+
return rgbaToHex(this._r, this._g, this._b, this._a);
|
1339
|
+
},
|
1340
|
+
toHex8String: function() {
|
1341
|
+
return '#' + this.toHex8();
|
1342
|
+
},
|
1343
|
+
toRgb: function() {
|
1344
|
+
return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
|
1345
|
+
},
|
1346
|
+
toRgbString: function() {
|
1347
|
+
return (this._a == 1) ?
|
1348
|
+
"rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
|
1349
|
+
"rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
|
1350
|
+
},
|
1351
|
+
toPercentageRgb: function() {
|
1352
|
+
return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
|
1353
|
+
},
|
1354
|
+
toPercentageRgbString: function() {
|
1355
|
+
return (this._a == 1) ?
|
1356
|
+
"rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
|
1357
|
+
"rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
|
1358
|
+
},
|
1359
|
+
toName: function() {
|
1360
|
+
if (this._a === 0) {
|
1361
|
+
return "transparent";
|
1362
|
+
}
|
1130
1363
|
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
_tc_id: tinyCounter++,
|
1135
|
-
alpha: a,
|
1136
|
-
getAlpha: function() {
|
1137
|
-
return a;
|
1138
|
-
},
|
1139
|
-
setAlpha: function(value) {
|
1140
|
-
a = boundAlpha(value);
|
1141
|
-
roundA = mathRound(100*a) / 100;
|
1142
|
-
},
|
1143
|
-
toHsv: function() {
|
1144
|
-
var hsv = rgbToHsv(r, g, b);
|
1145
|
-
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a };
|
1146
|
-
},
|
1147
|
-
toHsvString: function() {
|
1148
|
-
var hsv = rgbToHsv(r, g, b);
|
1149
|
-
var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
|
1150
|
-
return (a == 1) ?
|
1151
|
-
"hsv(" + h + ", " + s + "%, " + v + "%)" :
|
1152
|
-
"hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")";
|
1153
|
-
},
|
1154
|
-
toHsl: function() {
|
1155
|
-
var hsl = rgbToHsl(r, g, b);
|
1156
|
-
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a };
|
1157
|
-
},
|
1158
|
-
toHslString: function() {
|
1159
|
-
var hsl = rgbToHsl(r, g, b);
|
1160
|
-
var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
|
1161
|
-
return (a == 1) ?
|
1162
|
-
"hsl(" + h + ", " + s + "%, " + l + "%)" :
|
1163
|
-
"hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")";
|
1164
|
-
},
|
1165
|
-
toHex: function(allow3Char) {
|
1166
|
-
return rgbToHex(r, g, b, allow3Char);
|
1167
|
-
},
|
1168
|
-
toHexString: function(allow3Char) {
|
1169
|
-
return '#' + rgbToHex(r, g, b, allow3Char);
|
1170
|
-
},
|
1171
|
-
toRgb: function() {
|
1172
|
-
return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a };
|
1173
|
-
},
|
1174
|
-
toRgbString: function() {
|
1175
|
-
return (a == 1) ?
|
1176
|
-
"rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" :
|
1177
|
-
"rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")";
|
1178
|
-
},
|
1179
|
-
toPercentageRgb: function() {
|
1180
|
-
return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a };
|
1181
|
-
},
|
1182
|
-
toPercentageRgbString: function() {
|
1183
|
-
return (a == 1) ?
|
1184
|
-
"rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" :
|
1185
|
-
"rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")";
|
1186
|
-
},
|
1187
|
-
toName: function() {
|
1188
|
-
if (a === 0) {
|
1189
|
-
return "transparent";
|
1190
|
-
}
|
1364
|
+
if (this._a < 1) {
|
1365
|
+
return false;
|
1366
|
+
}
|
1191
1367
|
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
var secondAlphaHex = alphaHex;
|
1199
|
-
var gradientType = opts && opts.gradientType ? "GradientType = 1, " : "";
|
1200
|
-
|
1201
|
-
if (secondColor) {
|
1202
|
-
var s = tinycolor(secondColor);
|
1203
|
-
secondHex = s.toHex();
|
1204
|
-
secondAlphaHex = Math.round(parseFloat(s.alpha) * 255).toString(16);
|
1205
|
-
}
|
1368
|
+
return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
|
1369
|
+
},
|
1370
|
+
toFilter: function(secondColor) {
|
1371
|
+
var hex8String = '#' + rgbaToHex(this._r, this._g, this._b, this._a);
|
1372
|
+
var secondHex8String = hex8String;
|
1373
|
+
var gradientType = this._gradientType ? "GradientType = 1, " : "";
|
1206
1374
|
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
format = format || this.format;
|
1375
|
+
if (secondColor) {
|
1376
|
+
var s = tinycolor(secondColor);
|
1377
|
+
secondHex8String = s.toHex8String();
|
1378
|
+
}
|
1212
1379
|
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1380
|
+
return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
|
1381
|
+
},
|
1382
|
+
toString: function(format) {
|
1383
|
+
var formatSet = !!format;
|
1384
|
+
format = format || this._format;
|
1385
|
+
|
1386
|
+
var formattedString = false;
|
1387
|
+
var hasAlpha = this._a < 1 && this._a >= 0;
|
1388
|
+
var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "name");
|
1389
|
+
|
1390
|
+
if (needsAlphaFormat) {
|
1391
|
+
// Special case for "transparent", all other non-alpha formats
|
1392
|
+
// will return rgba when there is transparency.
|
1393
|
+
if (format === "name" && this._a === 0) {
|
1394
|
+
return this.toName();
|
1395
|
+
}
|
1396
|
+
return this.toRgbString();
|
1397
|
+
}
|
1398
|
+
if (format === "rgb") {
|
1399
|
+
formattedString = this.toRgbString();
|
1400
|
+
}
|
1401
|
+
if (format === "prgb") {
|
1402
|
+
formattedString = this.toPercentageRgbString();
|
1403
|
+
}
|
1404
|
+
if (format === "hex" || format === "hex6") {
|
1405
|
+
formattedString = this.toHexString();
|
1406
|
+
}
|
1407
|
+
if (format === "hex3") {
|
1408
|
+
formattedString = this.toHexString(true);
|
1409
|
+
}
|
1410
|
+
if (format === "hex8") {
|
1411
|
+
formattedString = this.toHex8String();
|
1412
|
+
}
|
1413
|
+
if (format === "name") {
|
1414
|
+
formattedString = this.toName();
|
1415
|
+
}
|
1416
|
+
if (format === "hsl") {
|
1417
|
+
formattedString = this.toHslString();
|
1418
|
+
}
|
1419
|
+
if (format === "hsv") {
|
1420
|
+
formattedString = this.toHsvString();
|
1421
|
+
}
|
1216
1422
|
|
1217
|
-
|
1218
|
-
|
1219
|
-
}
|
1220
|
-
if (format === "prgb") {
|
1221
|
-
formattedString = this.toPercentageRgbString();
|
1222
|
-
}
|
1223
|
-
if (format === "hex" || format === "hex6") {
|
1224
|
-
formattedString = this.toHexString();
|
1225
|
-
}
|
1226
|
-
if (format === "hex3") {
|
1227
|
-
formattedString = this.toHexString(true);
|
1228
|
-
}
|
1229
|
-
if (format === "name") {
|
1230
|
-
formattedString = this.toName();
|
1231
|
-
}
|
1232
|
-
if (format === "hsl") {
|
1233
|
-
formattedString = this.toHslString();
|
1234
|
-
}
|
1235
|
-
if (format === "hsv") {
|
1236
|
-
formattedString = this.toHsvString();
|
1237
|
-
}
|
1423
|
+
return formattedString || this.toHexString();
|
1424
|
+
},
|
1238
1425
|
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1426
|
+
_applyModification: function(fn, args) {
|
1427
|
+
var color = fn.apply(null, [this].concat([].slice.call(args)));
|
1428
|
+
this._r = color._r;
|
1429
|
+
this._g = color._g;
|
1430
|
+
this._b = color._b;
|
1431
|
+
this.setAlpha(color._a);
|
1432
|
+
return this;
|
1433
|
+
},
|
1434
|
+
lighten: function() {
|
1435
|
+
return this._applyModification(lighten, arguments);
|
1436
|
+
},
|
1437
|
+
brighten: function() {
|
1438
|
+
return this._applyModification(brighten, arguments);
|
1439
|
+
},
|
1440
|
+
darken: function() {
|
1441
|
+
return this._applyModification(darken, arguments);
|
1442
|
+
},
|
1443
|
+
desaturate: function() {
|
1444
|
+
return this._applyModification(desaturate, arguments);
|
1445
|
+
},
|
1446
|
+
saturate: function() {
|
1447
|
+
return this._applyModification(saturate, arguments);
|
1448
|
+
},
|
1449
|
+
greyscale: function() {
|
1450
|
+
return this._applyModification(greyscale, arguments);
|
1451
|
+
},
|
1452
|
+
spin: function() {
|
1453
|
+
return this._applyModification(spin, arguments);
|
1454
|
+
},
|
1242
1455
|
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1456
|
+
_applyCombination: function(fn, args) {
|
1457
|
+
return fn.apply(null, [this].concat([].slice.call(args)));
|
1458
|
+
},
|
1459
|
+
analogous: function() {
|
1460
|
+
return this._applyCombination(analogous, arguments);
|
1461
|
+
},
|
1462
|
+
complement: function() {
|
1463
|
+
return this._applyCombination(complement, arguments);
|
1464
|
+
},
|
1465
|
+
monochromatic: function() {
|
1466
|
+
return this._applyCombination(monochromatic, arguments);
|
1467
|
+
},
|
1468
|
+
splitcomplement: function() {
|
1469
|
+
return this._applyCombination(splitcomplement, arguments);
|
1470
|
+
},
|
1471
|
+
triad: function() {
|
1472
|
+
return this._applyCombination(triad, arguments);
|
1473
|
+
},
|
1474
|
+
tetrad: function() {
|
1475
|
+
return this._applyCombination(tetrad, arguments);
|
1246
1476
|
}
|
1477
|
+
};
|
1247
1478
|
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1259
|
-
|
1260
|
-
}
|
1479
|
+
// If input is an object, force 1 into "1.0" to handle ratios properly
|
1480
|
+
// String input requires "1.0" as input, so 1 will be treated as 1
|
1481
|
+
tinycolor.fromRatio = function(color, opts) {
|
1482
|
+
if (typeof color == "object") {
|
1483
|
+
var newColor = {};
|
1484
|
+
for (var i in color) {
|
1485
|
+
if (color.hasOwnProperty(i)) {
|
1486
|
+
if (i === "a") {
|
1487
|
+
newColor[i] = color[i];
|
1488
|
+
}
|
1489
|
+
else {
|
1490
|
+
newColor[i] = convertToPercentage(color[i]);
|
1261
1491
|
}
|
1262
1492
|
}
|
1263
|
-
color = newColor;
|
1264
1493
|
}
|
1494
|
+
color = newColor;
|
1495
|
+
}
|
1265
1496
|
|
1266
|
-
|
1267
|
-
|
1497
|
+
return tinycolor(color, opts);
|
1498
|
+
};
|
1268
1499
|
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1294
|
-
if (typeof color == "object") {
|
1295
|
-
if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
|
1296
|
-
rgb = rgbToRgb(color.r, color.g, color.b);
|
1297
|
-
ok = true;
|
1298
|
-
format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
|
1299
|
-
}
|
1300
|
-
else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
|
1301
|
-
color.s = convertToPercentage(color.s);
|
1302
|
-
color.v = convertToPercentage(color.v);
|
1303
|
-
rgb = hsvToRgb(color.h, color.s, color.v);
|
1304
|
-
ok = true;
|
1305
|
-
format = "hsv";
|
1306
|
-
}
|
1307
|
-
else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
|
1308
|
-
color.s = convertToPercentage(color.s);
|
1309
|
-
color.l = convertToPercentage(color.l);
|
1310
|
-
rgb = hslToRgb(color.h, color.s, color.l);
|
1311
|
-
ok = true;
|
1312
|
-
format = "hsl";
|
1313
|
-
}
|
1500
|
+
// Given a string or object, convert that input to RGB
|
1501
|
+
// Possible string inputs:
|
1502
|
+
//
|
1503
|
+
// "red"
|
1504
|
+
// "#f00" or "f00"
|
1505
|
+
// "#ff0000" or "ff0000"
|
1506
|
+
// "#ff000000" or "ff000000"
|
1507
|
+
// "rgb 255 0 0" or "rgb (255, 0, 0)"
|
1508
|
+
// "rgb 1.0 0 0" or "rgb (1, 0, 0)"
|
1509
|
+
// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
|
1510
|
+
// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
|
1511
|
+
// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
|
1512
|
+
// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
|
1513
|
+
// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
|
1514
|
+
//
|
1515
|
+
function inputToRGB(color) {
|
1516
|
+
|
1517
|
+
var rgb = { r: 0, g: 0, b: 0 };
|
1518
|
+
var a = 1;
|
1519
|
+
var ok = false;
|
1520
|
+
var format = false;
|
1521
|
+
|
1522
|
+
if (typeof color == "string") {
|
1523
|
+
color = stringInputToObject(color);
|
1524
|
+
}
|
1314
1525
|
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1526
|
+
if (typeof color == "object") {
|
1527
|
+
if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
|
1528
|
+
rgb = rgbToRgb(color.r, color.g, color.b);
|
1529
|
+
ok = true;
|
1530
|
+
format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
|
1531
|
+
}
|
1532
|
+
else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
|
1533
|
+
color.s = convertToPercentage(color.s);
|
1534
|
+
color.v = convertToPercentage(color.v);
|
1535
|
+
rgb = hsvToRgb(color.h, color.s, color.v);
|
1536
|
+
ok = true;
|
1537
|
+
format = "hsv";
|
1538
|
+
}
|
1539
|
+
else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
|
1540
|
+
color.s = convertToPercentage(color.s);
|
1541
|
+
color.l = convertToPercentage(color.l);
|
1542
|
+
rgb = hslToRgb(color.h, color.s, color.l);
|
1543
|
+
ok = true;
|
1544
|
+
format = "hsl";
|
1318
1545
|
}
|
1319
1546
|
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
ok: ok,
|
1324
|
-
format: color.format || format,
|
1325
|
-
r: mathMin(255, mathMax(rgb.r, 0)),
|
1326
|
-
g: mathMin(255, mathMax(rgb.g, 0)),
|
1327
|
-
b: mathMin(255, mathMax(rgb.b, 0)),
|
1328
|
-
a: a
|
1329
|
-
};
|
1547
|
+
if (color.hasOwnProperty("a")) {
|
1548
|
+
a = color.a;
|
1549
|
+
}
|
1330
1550
|
}
|
1331
1551
|
|
1552
|
+
a = boundAlpha(a);
|
1553
|
+
|
1554
|
+
return {
|
1555
|
+
ok: ok,
|
1556
|
+
format: color.format || format,
|
1557
|
+
r: mathMin(255, mathMax(rgb.r, 0)),
|
1558
|
+
g: mathMin(255, mathMax(rgb.g, 0)),
|
1559
|
+
b: mathMin(255, mathMax(rgb.b, 0)),
|
1560
|
+
a: a
|
1561
|
+
};
|
1562
|
+
}
|
1332
1563
|
|
1333
|
-
// Conversion Functions
|
1334
|
-
// --------------------
|
1335
1564
|
|
1336
|
-
|
1337
|
-
|
1565
|
+
// Conversion Functions
|
1566
|
+
// --------------------
|
1338
1567
|
|
1339
|
-
|
1340
|
-
|
1341
|
-
// <http://www.w3.org/TR/css3-color/>
|
1342
|
-
// *Assumes:* r, g, b in [0, 255] or [0, 1]
|
1343
|
-
// *Returns:* { r, g, b } in [0, 255]
|
1344
|
-
function rgbToRgb(r, g, b){
|
1345
|
-
return {
|
1346
|
-
r: bound01(r, 255) * 255,
|
1347
|
-
g: bound01(g, 255) * 255,
|
1348
|
-
b: bound01(b, 255) * 255
|
1349
|
-
};
|
1350
|
-
}
|
1568
|
+
// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
|
1569
|
+
// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
|
1351
1570
|
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1571
|
+
// `rgbToRgb`
|
1572
|
+
// Handle bounds / percentage checking to conform to CSS color spec
|
1573
|
+
// <http://www.w3.org/TR/css3-color/>
|
1574
|
+
// *Assumes:* r, g, b in [0, 255] or [0, 1]
|
1575
|
+
// *Returns:* { r, g, b } in [0, 255]
|
1576
|
+
function rgbToRgb(r, g, b){
|
1577
|
+
return {
|
1578
|
+
r: bound01(r, 255) * 255,
|
1579
|
+
g: bound01(g, 255) * 255,
|
1580
|
+
b: bound01(b, 255) * 255
|
1581
|
+
};
|
1582
|
+
}
|
1357
1583
|
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1584
|
+
// `rgbToHsl`
|
1585
|
+
// Converts an RGB color value to HSL.
|
1586
|
+
// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
|
1587
|
+
// *Returns:* { h, s, l } in [0,1]
|
1588
|
+
function rgbToHsl(r, g, b) {
|
1361
1589
|
|
1362
|
-
|
1363
|
-
|
1590
|
+
r = bound01(r, 255);
|
1591
|
+
g = bound01(g, 255);
|
1592
|
+
b = bound01(b, 255);
|
1364
1593
|
|
1365
|
-
|
1366
|
-
|
1367
|
-
}
|
1368
|
-
else {
|
1369
|
-
var d = max - min;
|
1370
|
-
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
1371
|
-
switch(max) {
|
1372
|
-
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
|
1373
|
-
case g: h = (b - r) / d + 2; break;
|
1374
|
-
case b: h = (r - g) / d + 4; break;
|
1375
|
-
}
|
1594
|
+
var max = mathMax(r, g, b), min = mathMin(r, g, b);
|
1595
|
+
var h, s, l = (max + min) / 2;
|
1376
1596
|
|
1377
|
-
|
1597
|
+
if(max == min) {
|
1598
|
+
h = s = 0; // achromatic
|
1599
|
+
}
|
1600
|
+
else {
|
1601
|
+
var d = max - min;
|
1602
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
1603
|
+
switch(max) {
|
1604
|
+
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
|
1605
|
+
case g: h = (b - r) / d + 2; break;
|
1606
|
+
case b: h = (r - g) / d + 4; break;
|
1378
1607
|
}
|
1379
1608
|
|
1380
|
-
|
1609
|
+
h /= 6;
|
1381
1610
|
}
|
1382
1611
|
|
1383
|
-
|
1384
|
-
|
1385
|
-
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
|
1386
|
-
// *Returns:* { r, g, b } in the set [0, 255]
|
1387
|
-
function hslToRgb(h, s, l) {
|
1388
|
-
var r, g, b;
|
1389
|
-
|
1390
|
-
h = bound01(h, 360);
|
1391
|
-
s = bound01(s, 100);
|
1392
|
-
l = bound01(l, 100);
|
1393
|
-
|
1394
|
-
function hue2rgb(p, q, t) {
|
1395
|
-
if(t < 0) t += 1;
|
1396
|
-
if(t > 1) t -= 1;
|
1397
|
-
if(t < 1/6) return p + (q - p) * 6 * t;
|
1398
|
-
if(t < 1/2) return q;
|
1399
|
-
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
1400
|
-
return p;
|
1401
|
-
}
|
1612
|
+
return { h: h, s: s, l: l };
|
1613
|
+
}
|
1402
1614
|
|
1403
|
-
|
1404
|
-
|
1405
|
-
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1409
|
-
|
1410
|
-
|
1411
|
-
|
1412
|
-
|
1615
|
+
// `hslToRgb`
|
1616
|
+
// Converts an HSL color value to RGB.
|
1617
|
+
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
|
1618
|
+
// *Returns:* { r, g, b } in the set [0, 255]
|
1619
|
+
function hslToRgb(h, s, l) {
|
1620
|
+
var r, g, b;
|
1621
|
+
|
1622
|
+
h = bound01(h, 360);
|
1623
|
+
s = bound01(s, 100);
|
1624
|
+
l = bound01(l, 100);
|
1625
|
+
|
1626
|
+
function hue2rgb(p, q, t) {
|
1627
|
+
if(t < 0) t += 1;
|
1628
|
+
if(t > 1) t -= 1;
|
1629
|
+
if(t < 1/6) return p + (q - p) * 6 * t;
|
1630
|
+
if(t < 1/2) return q;
|
1631
|
+
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
1632
|
+
return p;
|
1633
|
+
}
|
1413
1634
|
|
1414
|
-
|
1635
|
+
if(s === 0) {
|
1636
|
+
r = g = b = l; // achromatic
|
1637
|
+
}
|
1638
|
+
else {
|
1639
|
+
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
1640
|
+
var p = 2 * l - q;
|
1641
|
+
r = hue2rgb(p, q, h + 1/3);
|
1642
|
+
g = hue2rgb(p, q, h);
|
1643
|
+
b = hue2rgb(p, q, h - 1/3);
|
1415
1644
|
}
|
1416
1645
|
|
1417
|
-
|
1418
|
-
|
1419
|
-
// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
|
1420
|
-
// *Returns:* { h, s, v } in [0,1]
|
1421
|
-
function rgbToHsv(r, g, b) {
|
1646
|
+
return { r: r * 255, g: g * 255, b: b * 255 };
|
1647
|
+
}
|
1422
1648
|
|
1423
|
-
|
1424
|
-
|
1425
|
-
|
1649
|
+
// `rgbToHsv`
|
1650
|
+
// Converts an RGB color value to HSV
|
1651
|
+
// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
|
1652
|
+
// *Returns:* { h, s, v } in [0,1]
|
1653
|
+
function rgbToHsv(r, g, b) {
|
1426
1654
|
|
1427
|
-
|
1428
|
-
|
1655
|
+
r = bound01(r, 255);
|
1656
|
+
g = bound01(g, 255);
|
1657
|
+
b = bound01(b, 255);
|
1429
1658
|
|
1430
|
-
|
1431
|
-
|
1659
|
+
var max = mathMax(r, g, b), min = mathMin(r, g, b);
|
1660
|
+
var h, s, v = max;
|
1432
1661
|
|
1433
|
-
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
h
|
1662
|
+
var d = max - min;
|
1663
|
+
s = max === 0 ? 0 : d / max;
|
1664
|
+
|
1665
|
+
if(max == min) {
|
1666
|
+
h = 0; // achromatic
|
1667
|
+
}
|
1668
|
+
else {
|
1669
|
+
switch(max) {
|
1670
|
+
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
|
1671
|
+
case g: h = (b - r) / d + 2; break;
|
1672
|
+
case b: h = (r - g) / d + 4; break;
|
1443
1673
|
}
|
1444
|
-
|
1674
|
+
h /= 6;
|
1445
1675
|
}
|
1676
|
+
return { h: h, s: s, v: v };
|
1677
|
+
}
|
1446
1678
|
|
1447
|
-
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1460
|
-
|
1461
|
-
|
1462
|
-
|
1463
|
-
|
1464
|
-
|
1465
|
-
|
1679
|
+
// `hsvToRgb`
|
1680
|
+
// Converts an HSV color value to RGB.
|
1681
|
+
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
|
1682
|
+
// *Returns:* { r, g, b } in the set [0, 255]
|
1683
|
+
function hsvToRgb(h, s, v) {
|
1684
|
+
|
1685
|
+
h = bound01(h, 360) * 6;
|
1686
|
+
s = bound01(s, 100);
|
1687
|
+
v = bound01(v, 100);
|
1688
|
+
|
1689
|
+
var i = math.floor(h),
|
1690
|
+
f = h - i,
|
1691
|
+
p = v * (1 - s),
|
1692
|
+
q = v * (1 - f * s),
|
1693
|
+
t = v * (1 - (1 - f) * s),
|
1694
|
+
mod = i % 6,
|
1695
|
+
r = [v, q, p, p, t, v][mod],
|
1696
|
+
g = [t, v, v, q, p, p][mod],
|
1697
|
+
b = [p, p, t, v, v, q][mod];
|
1698
|
+
|
1699
|
+
return { r: r * 255, g: g * 255, b: b * 255 };
|
1700
|
+
}
|
1466
1701
|
|
1467
|
-
|
1702
|
+
// `rgbToHex`
|
1703
|
+
// Converts an RGB color to hex
|
1704
|
+
// Assumes r, g, and b are contained in the set [0, 255]
|
1705
|
+
// Returns a 3 or 6 character hex
|
1706
|
+
function rgbToHex(r, g, b, allow3Char) {
|
1707
|
+
|
1708
|
+
var hex = [
|
1709
|
+
pad2(mathRound(r).toString(16)),
|
1710
|
+
pad2(mathRound(g).toString(16)),
|
1711
|
+
pad2(mathRound(b).toString(16))
|
1712
|
+
];
|
1713
|
+
|
1714
|
+
// Return a 3 character hex if possible
|
1715
|
+
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
|
1716
|
+
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
|
1468
1717
|
}
|
1469
1718
|
|
1470
|
-
|
1471
|
-
|
1472
|
-
//
|
1473
|
-
//
|
1474
|
-
|
1719
|
+
return hex.join("");
|
1720
|
+
}
|
1721
|
+
// `rgbaToHex`
|
1722
|
+
// Converts an RGBA color plus alpha transparency to hex
|
1723
|
+
// Assumes r, g, b and a are contained in the set [0, 255]
|
1724
|
+
// Returns an 8 character hex
|
1725
|
+
function rgbaToHex(r, g, b, a) {
|
1475
1726
|
|
1476
1727
|
var hex = [
|
1728
|
+
pad2(convertDecimalToHex(a)),
|
1477
1729
|
pad2(mathRound(r).toString(16)),
|
1478
1730
|
pad2(mathRound(g).toString(16)),
|
1479
1731
|
pad2(mathRound(b).toString(16))
|
1480
1732
|
];
|
1481
1733
|
|
1482
|
-
// Return a 3 character hex if possible
|
1483
|
-
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
|
1484
|
-
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
|
1485
|
-
}
|
1486
|
-
|
1487
1734
|
return hex.join("");
|
1488
1735
|
}
|
1489
1736
|
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
|
1500
|
-
|
1501
|
-
|
1502
|
-
|
1737
|
+
// `equals`
|
1738
|
+
// Can be called with any tinycolor input
|
1739
|
+
tinycolor.equals = function (color1, color2) {
|
1740
|
+
if (!color1 || !color2) { return false; }
|
1741
|
+
return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
|
1742
|
+
};
|
1743
|
+
tinycolor.random = function() {
|
1744
|
+
return tinycolor.fromRatio({
|
1745
|
+
r: mathRandom(),
|
1746
|
+
g: mathRandom(),
|
1747
|
+
b: mathRandom()
|
1748
|
+
});
|
1749
|
+
};
|
1503
1750
|
|
1504
1751
|
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1508
|
-
|
1752
|
+
// Modification Functions
|
1753
|
+
// ----------------------
|
1754
|
+
// Thanks to less.js for some of the basics here
|
1755
|
+
// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
|
1509
1756
|
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
tinycolor.saturate = function (color, amount) {
|
1518
|
-
amount = (amount === 0) ? 0 : (amount || 10);
|
1519
|
-
var hsl = tinycolor(color).toHsl();
|
1520
|
-
hsl.s += amount / 100;
|
1521
|
-
hsl.s = clamp01(hsl.s);
|
1522
|
-
return tinycolor(hsl);
|
1523
|
-
};
|
1524
|
-
tinycolor.greyscale = function(color) {
|
1525
|
-
return tinycolor.desaturate(color, 100);
|
1526
|
-
};
|
1527
|
-
tinycolor.lighten = function(color, amount) {
|
1528
|
-
amount = (amount === 0) ? 0 : (amount || 10);
|
1529
|
-
var hsl = tinycolor(color).toHsl();
|
1530
|
-
hsl.l += amount / 100;
|
1531
|
-
hsl.l = clamp01(hsl.l);
|
1532
|
-
return tinycolor(hsl);
|
1533
|
-
};
|
1534
|
-
tinycolor.darken = function (color, amount) {
|
1535
|
-
amount = (amount === 0) ? 0 : (amount || 10);
|
1536
|
-
var hsl = tinycolor(color).toHsl();
|
1537
|
-
hsl.l -= amount / 100;
|
1538
|
-
hsl.l = clamp01(hsl.l);
|
1539
|
-
return tinycolor(hsl);
|
1540
|
-
};
|
1541
|
-
tinycolor.complement = function(color) {
|
1542
|
-
var hsl = tinycolor(color).toHsl();
|
1543
|
-
hsl.h = (hsl.h + 180) % 360;
|
1544
|
-
return tinycolor(hsl);
|
1545
|
-
};
|
1757
|
+
function desaturate(color, amount) {
|
1758
|
+
amount = (amount === 0) ? 0 : (amount || 10);
|
1759
|
+
var hsl = tinycolor(color).toHsl();
|
1760
|
+
hsl.s -= amount / 100;
|
1761
|
+
hsl.s = clamp01(hsl.s);
|
1762
|
+
return tinycolor(hsl);
|
1763
|
+
}
|
1546
1764
|
|
1765
|
+
function saturate(color, amount) {
|
1766
|
+
amount = (amount === 0) ? 0 : (amount || 10);
|
1767
|
+
var hsl = tinycolor(color).toHsl();
|
1768
|
+
hsl.s += amount / 100;
|
1769
|
+
hsl.s = clamp01(hsl.s);
|
1770
|
+
return tinycolor(hsl);
|
1771
|
+
}
|
1547
1772
|
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
|
1773
|
+
function greyscale(color) {
|
1774
|
+
return tinycolor(color).desaturate(100);
|
1775
|
+
}
|
1552
1776
|
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
];
|
1561
|
-
};
|
1562
|
-
tinycolor.tetrad = function(color) {
|
1563
|
-
var hsl = tinycolor(color).toHsl();
|
1564
|
-
var h = hsl.h;
|
1565
|
-
return [
|
1566
|
-
tinycolor(color),
|
1567
|
-
tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
|
1568
|
-
tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
|
1569
|
-
tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
|
1570
|
-
];
|
1571
|
-
};
|
1572
|
-
tinycolor.splitcomplement = function(color) {
|
1573
|
-
var hsl = tinycolor(color).toHsl();
|
1574
|
-
var h = hsl.h;
|
1575
|
-
return [
|
1576
|
-
tinycolor(color),
|
1577
|
-
tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
|
1578
|
-
tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
|
1579
|
-
];
|
1580
|
-
};
|
1581
|
-
tinycolor.analogous = function(color, results, slices) {
|
1582
|
-
results = results || 6;
|
1583
|
-
slices = slices || 30;
|
1777
|
+
function lighten (color, amount) {
|
1778
|
+
amount = (amount === 0) ? 0 : (amount || 10);
|
1779
|
+
var hsl = tinycolor(color).toHsl();
|
1780
|
+
hsl.l += amount / 100;
|
1781
|
+
hsl.l = clamp01(hsl.l);
|
1782
|
+
return tinycolor(hsl);
|
1783
|
+
}
|
1584
1784
|
|
1585
|
-
|
1586
|
-
|
1587
|
-
|
1785
|
+
function brighten(color, amount) {
|
1786
|
+
amount = (amount === 0) ? 0 : (amount || 10);
|
1787
|
+
var rgb = tinycolor(color).toRgb();
|
1788
|
+
rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
|
1789
|
+
rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
|
1790
|
+
rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
|
1791
|
+
return tinycolor(rgb);
|
1792
|
+
}
|
1588
1793
|
|
1589
|
-
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
results = results || 6;
|
1597
|
-
var hsv = tinycolor(color).toHsv();
|
1598
|
-
var h = hsv.h, s = hsv.s, v = hsv.v;
|
1599
|
-
var ret = [];
|
1600
|
-
var modification = 1 / results;
|
1794
|
+
function darken (color, amount) {
|
1795
|
+
amount = (amount === 0) ? 0 : (amount || 10);
|
1796
|
+
var hsl = tinycolor(color).toHsl();
|
1797
|
+
hsl.l -= amount / 100;
|
1798
|
+
hsl.l = clamp01(hsl.l);
|
1799
|
+
return tinycolor(hsl);
|
1800
|
+
}
|
1601
1801
|
|
1602
|
-
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1802
|
+
// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
|
1803
|
+
// Values outside of this range will be wrapped into this range.
|
1804
|
+
function spin(color, amount) {
|
1805
|
+
var hsl = tinycolor(color).toHsl();
|
1806
|
+
var hue = (mathRound(hsl.h) + amount) % 360;
|
1807
|
+
hsl.h = hue < 0 ? 360 + hue : hue;
|
1808
|
+
return tinycolor(hsl);
|
1809
|
+
}
|
1606
1810
|
|
1607
|
-
|
1608
|
-
|
1811
|
+
// Combination Functions
|
1812
|
+
// ---------------------
|
1813
|
+
// Thanks to jQuery xColor for some of the ideas behind these
|
1814
|
+
// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
|
1609
1815
|
|
1816
|
+
function complement(color) {
|
1817
|
+
var hsl = tinycolor(color).toHsl();
|
1818
|
+
hsl.h = (hsl.h + 180) % 360;
|
1819
|
+
return tinycolor(hsl);
|
1820
|
+
}
|
1610
1821
|
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1620
|
-
var a = tinycolor(color1).toRgb();
|
1621
|
-
var b = tinycolor(color2).toRgb();
|
1622
|
-
var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000;
|
1623
|
-
var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000;
|
1624
|
-
var colorDiff = (
|
1625
|
-
Math.max(a.r, b.r) - Math.min(a.r, b.r) +
|
1626
|
-
Math.max(a.g, b.g) - Math.min(a.g, b.g) +
|
1627
|
-
Math.max(a.b, b.b) - Math.min(a.b, b.b)
|
1628
|
-
);
|
1822
|
+
function triad(color) {
|
1823
|
+
var hsl = tinycolor(color).toHsl();
|
1824
|
+
var h = hsl.h;
|
1825
|
+
return [
|
1826
|
+
tinycolor(color),
|
1827
|
+
tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
|
1828
|
+
tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
|
1829
|
+
];
|
1830
|
+
}
|
1629
1831
|
|
1630
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
|
1634
|
-
|
1832
|
+
function tetrad(color) {
|
1833
|
+
var hsl = tinycolor(color).toHsl();
|
1834
|
+
var h = hsl.h;
|
1835
|
+
return [
|
1836
|
+
tinycolor(color),
|
1837
|
+
tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
|
1838
|
+
tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
|
1839
|
+
tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
|
1840
|
+
];
|
1841
|
+
}
|
1635
1842
|
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
1644
|
-
|
1843
|
+
function splitcomplement(color) {
|
1844
|
+
var hsl = tinycolor(color).toHsl();
|
1845
|
+
var h = hsl.h;
|
1846
|
+
return [
|
1847
|
+
tinycolor(color),
|
1848
|
+
tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
|
1849
|
+
tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
|
1850
|
+
];
|
1851
|
+
}
|
1645
1852
|
|
1646
|
-
|
1647
|
-
|
1648
|
-
|
1649
|
-
|
1650
|
-
|
1651
|
-
|
1652
|
-
|
1653
|
-
|
1654
|
-
|
1655
|
-
|
1656
|
-
|
1657
|
-
|
1658
|
-
|
1659
|
-
|
1660
|
-
var readability = tinycolor.readability(baseColor, colorList[i]);
|
1661
|
-
var readable = readability.brightness > 125 && readability.color > 500;
|
1662
|
-
var score = 3 * (readability.brightness / 125) + (readability.color / 500);
|
1663
|
-
|
1664
|
-
if ((readable && ! bestIsReadable) ||
|
1665
|
-
(readable && bestIsReadable && score > bestScore) ||
|
1666
|
-
((! readable) && (! bestIsReadable) && score > bestScore)) {
|
1667
|
-
bestIsReadable = readable;
|
1668
|
-
bestScore = score;
|
1669
|
-
bestColor = tinycolor(colorList[i]);
|
1670
|
-
}
|
1671
|
-
}
|
1672
|
-
return bestColor;
|
1673
|
-
};
|
1853
|
+
function analogous(color, results, slices) {
|
1854
|
+
results = results || 6;
|
1855
|
+
slices = slices || 30;
|
1856
|
+
|
1857
|
+
var hsl = tinycolor(color).toHsl();
|
1858
|
+
var part = 360 / slices;
|
1859
|
+
var ret = [tinycolor(color)];
|
1860
|
+
|
1861
|
+
for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
|
1862
|
+
hsl.h = (hsl.h + part) % 360;
|
1863
|
+
ret.push(tinycolor(hsl));
|
1864
|
+
}
|
1865
|
+
return ret;
|
1866
|
+
}
|
1674
1867
|
|
1868
|
+
function monochromatic(color, results) {
|
1869
|
+
results = results || 6;
|
1870
|
+
var hsv = tinycolor(color).toHsv();
|
1871
|
+
var h = hsv.h, s = hsv.s, v = hsv.v;
|
1872
|
+
var ret = [];
|
1873
|
+
var modification = 1 / results;
|
1675
1874
|
|
1676
|
-
|
1677
|
-
|
1678
|
-
|
1679
|
-
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
|
1684
|
-
|
1685
|
-
|
1686
|
-
|
1687
|
-
|
1688
|
-
|
1689
|
-
|
1690
|
-
|
1691
|
-
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
1706
|
-
|
1707
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
darksalmon: "e9967a",
|
1715
|
-
darkseagreen: "8fbc8f",
|
1716
|
-
darkslateblue: "483d8b",
|
1717
|
-
darkslategray: "2f4f4f",
|
1718
|
-
darkslategrey: "2f4f4f",
|
1719
|
-
darkturquoise: "00ced1",
|
1720
|
-
darkviolet: "9400d3",
|
1721
|
-
deeppink: "ff1493",
|
1722
|
-
deepskyblue: "00bfff",
|
1723
|
-
dimgray: "696969",
|
1724
|
-
dimgrey: "696969",
|
1725
|
-
dodgerblue: "1e90ff",
|
1726
|
-
firebrick: "b22222",
|
1727
|
-
floralwhite: "fffaf0",
|
1728
|
-
forestgreen: "228b22",
|
1729
|
-
fuchsia: "f0f",
|
1730
|
-
gainsboro: "dcdcdc",
|
1731
|
-
ghostwhite: "f8f8ff",
|
1732
|
-
gold: "ffd700",
|
1733
|
-
goldenrod: "daa520",
|
1734
|
-
gray: "808080",
|
1735
|
-
green: "008000",
|
1736
|
-
greenyellow: "adff2f",
|
1737
|
-
grey: "808080",
|
1738
|
-
honeydew: "f0fff0",
|
1739
|
-
hotpink: "ff69b4",
|
1740
|
-
indianred: "cd5c5c",
|
1741
|
-
indigo: "4b0082",
|
1742
|
-
ivory: "fffff0",
|
1743
|
-
khaki: "f0e68c",
|
1744
|
-
lavender: "e6e6fa",
|
1745
|
-
lavenderblush: "fff0f5",
|
1746
|
-
lawngreen: "7cfc00",
|
1747
|
-
lemonchiffon: "fffacd",
|
1748
|
-
lightblue: "add8e6",
|
1749
|
-
lightcoral: "f08080",
|
1750
|
-
lightcyan: "e0ffff",
|
1751
|
-
lightgoldenrodyellow: "fafad2",
|
1752
|
-
lightgray: "d3d3d3",
|
1753
|
-
lightgreen: "90ee90",
|
1754
|
-
lightgrey: "d3d3d3",
|
1755
|
-
lightpink: "ffb6c1",
|
1756
|
-
lightsalmon: "ffa07a",
|
1757
|
-
lightseagreen: "20b2aa",
|
1758
|
-
lightskyblue: "87cefa",
|
1759
|
-
lightslategray: "789",
|
1760
|
-
lightslategrey: "789",
|
1761
|
-
lightsteelblue: "b0c4de",
|
1762
|
-
lightyellow: "ffffe0",
|
1763
|
-
lime: "0f0",
|
1764
|
-
limegreen: "32cd32",
|
1765
|
-
linen: "faf0e6",
|
1766
|
-
magenta: "f0f",
|
1767
|
-
maroon: "800000",
|
1768
|
-
mediumaquamarine: "66cdaa",
|
1769
|
-
mediumblue: "0000cd",
|
1770
|
-
mediumorchid: "ba55d3",
|
1771
|
-
mediumpurple: "9370db",
|
1772
|
-
mediumseagreen: "3cb371",
|
1773
|
-
mediumslateblue: "7b68ee",
|
1774
|
-
mediumspringgreen: "00fa9a",
|
1775
|
-
mediumturquoise: "48d1cc",
|
1776
|
-
mediumvioletred: "c71585",
|
1777
|
-
midnightblue: "191970",
|
1778
|
-
mintcream: "f5fffa",
|
1779
|
-
mistyrose: "ffe4e1",
|
1780
|
-
moccasin: "ffe4b5",
|
1781
|
-
navajowhite: "ffdead",
|
1782
|
-
navy: "000080",
|
1783
|
-
oldlace: "fdf5e6",
|
1784
|
-
olive: "808000",
|
1785
|
-
olivedrab: "6b8e23",
|
1786
|
-
orange: "ffa500",
|
1787
|
-
orangered: "ff4500",
|
1788
|
-
orchid: "da70d6",
|
1789
|
-
palegoldenrod: "eee8aa",
|
1790
|
-
palegreen: "98fb98",
|
1791
|
-
paleturquoise: "afeeee",
|
1792
|
-
palevioletred: "db7093",
|
1793
|
-
papayawhip: "ffefd5",
|
1794
|
-
peachpuff: "ffdab9",
|
1795
|
-
peru: "cd853f",
|
1796
|
-
pink: "ffc0cb",
|
1797
|
-
plum: "dda0dd",
|
1798
|
-
powderblue: "b0e0e6",
|
1799
|
-
purple: "800080",
|
1800
|
-
red: "f00",
|
1801
|
-
rosybrown: "bc8f8f",
|
1802
|
-
royalblue: "4169e1",
|
1803
|
-
saddlebrown: "8b4513",
|
1804
|
-
salmon: "fa8072",
|
1805
|
-
sandybrown: "f4a460",
|
1806
|
-
seagreen: "2e8b57",
|
1807
|
-
seashell: "fff5ee",
|
1808
|
-
sienna: "a0522d",
|
1809
|
-
silver: "c0c0c0",
|
1810
|
-
skyblue: "87ceeb",
|
1811
|
-
slateblue: "6a5acd",
|
1812
|
-
slategray: "708090",
|
1813
|
-
slategrey: "708090",
|
1814
|
-
snow: "fffafa",
|
1815
|
-
springgreen: "00ff7f",
|
1816
|
-
steelblue: "4682b4",
|
1817
|
-
tan: "d2b48c",
|
1818
|
-
teal: "008080",
|
1819
|
-
thistle: "d8bfd8",
|
1820
|
-
tomato: "ff6347",
|
1821
|
-
turquoise: "40e0d0",
|
1822
|
-
violet: "ee82ee",
|
1823
|
-
wheat: "f5deb3",
|
1824
|
-
white: "fff",
|
1825
|
-
whitesmoke: "f5f5f5",
|
1826
|
-
yellow: "ff0",
|
1827
|
-
yellowgreen: "9acd32"
|
1875
|
+
while (results--) {
|
1876
|
+
ret.push(tinycolor({ h: h, s: s, v: v}));
|
1877
|
+
v = (v + modification) % 1;
|
1878
|
+
}
|
1879
|
+
|
1880
|
+
return ret;
|
1881
|
+
}
|
1882
|
+
|
1883
|
+
// Utility Functions
|
1884
|
+
// ---------------------
|
1885
|
+
|
1886
|
+
tinycolor.mix = function(color1, color2, amount) {
|
1887
|
+
amount = (amount === 0) ? 0 : (amount || 50);
|
1888
|
+
|
1889
|
+
var rgb1 = tinycolor(color1).toRgb();
|
1890
|
+
var rgb2 = tinycolor(color2).toRgb();
|
1891
|
+
|
1892
|
+
var p = amount / 100;
|
1893
|
+
var w = p * 2 - 1;
|
1894
|
+
var a = rgb2.a - rgb1.a;
|
1895
|
+
|
1896
|
+
var w1;
|
1897
|
+
|
1898
|
+
if (w * a == -1) {
|
1899
|
+
w1 = w;
|
1900
|
+
} else {
|
1901
|
+
w1 = (w + a) / (1 + w * a);
|
1902
|
+
}
|
1903
|
+
|
1904
|
+
w1 = (w1 + 1) / 2;
|
1905
|
+
|
1906
|
+
var w2 = 1 - w1;
|
1907
|
+
|
1908
|
+
var rgba = {
|
1909
|
+
r: rgb2.r * w1 + rgb1.r * w2,
|
1910
|
+
g: rgb2.g * w1 + rgb1.g * w2,
|
1911
|
+
b: rgb2.b * w1 + rgb1.b * w2,
|
1912
|
+
a: rgb2.a * p + rgb1.a * (1 - p)
|
1828
1913
|
};
|
1829
1914
|
|
1830
|
-
|
1831
|
-
|
1915
|
+
return tinycolor(rgba);
|
1916
|
+
};
|
1917
|
+
|
1832
1918
|
|
1919
|
+
// Readability Functions
|
1920
|
+
// ---------------------
|
1921
|
+
// <http://www.w3.org/TR/AERT#color-contrast>
|
1922
|
+
|
1923
|
+
// `readability`
|
1924
|
+
// Analyze the 2 colors and returns an object with the following properties:
|
1925
|
+
// `brightness`: difference in brightness between the two colors
|
1926
|
+
// `color`: difference in color/hue between the two colors
|
1927
|
+
tinycolor.readability = function(color1, color2) {
|
1928
|
+
var c1 = tinycolor(color1);
|
1929
|
+
var c2 = tinycolor(color2);
|
1930
|
+
var rgb1 = c1.toRgb();
|
1931
|
+
var rgb2 = c2.toRgb();
|
1932
|
+
var brightnessA = c1.getBrightness();
|
1933
|
+
var brightnessB = c2.getBrightness();
|
1934
|
+
var colorDiff = (
|
1935
|
+
Math.max(rgb1.r, rgb2.r) - Math.min(rgb1.r, rgb2.r) +
|
1936
|
+
Math.max(rgb1.g, rgb2.g) - Math.min(rgb1.g, rgb2.g) +
|
1937
|
+
Math.max(rgb1.b, rgb2.b) - Math.min(rgb1.b, rgb2.b)
|
1938
|
+
);
|
1939
|
+
|
1940
|
+
return {
|
1941
|
+
brightness: Math.abs(brightnessA - brightnessB),
|
1942
|
+
color: colorDiff
|
1943
|
+
};
|
1944
|
+
};
|
1833
1945
|
|
1834
|
-
|
1835
|
-
|
1946
|
+
// `readable`
|
1947
|
+
// http://www.w3.org/TR/AERT#color-contrast
|
1948
|
+
// Ensure that foreground and background color combinations provide sufficient contrast.
|
1949
|
+
// *Example*
|
1950
|
+
// tinycolor.isReadable("#000", "#111") => false
|
1951
|
+
tinycolor.isReadable = function(color1, color2) {
|
1952
|
+
var readability = tinycolor.readability(color1, color2);
|
1953
|
+
return readability.brightness > 125 && readability.color > 500;
|
1954
|
+
};
|
1836
1955
|
|
1837
|
-
|
1838
|
-
|
1839
|
-
|
1840
|
-
|
1841
|
-
|
1842
|
-
|
1843
|
-
|
1956
|
+
// `mostReadable`
|
1957
|
+
// Given a base color and a list of possible foreground or background
|
1958
|
+
// colors for that base, returns the most readable color.
|
1959
|
+
// *Example*
|
1960
|
+
// tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000"
|
1961
|
+
tinycolor.mostReadable = function(baseColor, colorList) {
|
1962
|
+
var bestColor = null;
|
1963
|
+
var bestScore = 0;
|
1964
|
+
var bestIsReadable = false;
|
1965
|
+
for (var i=0; i < colorList.length; i++) {
|
1966
|
+
|
1967
|
+
// We normalize both around the "acceptable" breaking point,
|
1968
|
+
// but rank brightness constrast higher than hue.
|
1969
|
+
|
1970
|
+
var readability = tinycolor.readability(baseColor, colorList[i]);
|
1971
|
+
var readable = readability.brightness > 125 && readability.color > 500;
|
1972
|
+
var score = 3 * (readability.brightness / 125) + (readability.color / 500);
|
1973
|
+
|
1974
|
+
if ((readable && ! bestIsReadable) ||
|
1975
|
+
(readable && bestIsReadable && score > bestScore) ||
|
1976
|
+
((! readable) && (! bestIsReadable) && score > bestScore)) {
|
1977
|
+
bestIsReadable = readable;
|
1978
|
+
bestScore = score;
|
1979
|
+
bestColor = tinycolor(colorList[i]);
|
1844
1980
|
}
|
1845
|
-
return flipped;
|
1846
1981
|
}
|
1982
|
+
return bestColor;
|
1983
|
+
};
|
1847
1984
|
|
1848
|
-
// Return a valid alpha value [0,1] with all invalid values being set to 1
|
1849
|
-
function boundAlpha(a) {
|
1850
|
-
a = parseFloat(a);
|
1851
1985
|
|
1852
|
-
|
1853
|
-
|
1854
|
-
|
1986
|
+
// Big List of Colors
|
1987
|
+
// ------------------
|
1988
|
+
// <http://www.w3.org/TR/css3-color/#svg-color>
|
1989
|
+
var names = tinycolor.names = {
|
1990
|
+
aliceblue: "f0f8ff",
|
1991
|
+
antiquewhite: "faebd7",
|
1992
|
+
aqua: "0ff",
|
1993
|
+
aquamarine: "7fffd4",
|
1994
|
+
azure: "f0ffff",
|
1995
|
+
beige: "f5f5dc",
|
1996
|
+
bisque: "ffe4c4",
|
1997
|
+
black: "000",
|
1998
|
+
blanchedalmond: "ffebcd",
|
1999
|
+
blue: "00f",
|
2000
|
+
blueviolet: "8a2be2",
|
2001
|
+
brown: "a52a2a",
|
2002
|
+
burlywood: "deb887",
|
2003
|
+
burntsienna: "ea7e5d",
|
2004
|
+
cadetblue: "5f9ea0",
|
2005
|
+
chartreuse: "7fff00",
|
2006
|
+
chocolate: "d2691e",
|
2007
|
+
coral: "ff7f50",
|
2008
|
+
cornflowerblue: "6495ed",
|
2009
|
+
cornsilk: "fff8dc",
|
2010
|
+
crimson: "dc143c",
|
2011
|
+
cyan: "0ff",
|
2012
|
+
darkblue: "00008b",
|
2013
|
+
darkcyan: "008b8b",
|
2014
|
+
darkgoldenrod: "b8860b",
|
2015
|
+
darkgray: "a9a9a9",
|
2016
|
+
darkgreen: "006400",
|
2017
|
+
darkgrey: "a9a9a9",
|
2018
|
+
darkkhaki: "bdb76b",
|
2019
|
+
darkmagenta: "8b008b",
|
2020
|
+
darkolivegreen: "556b2f",
|
2021
|
+
darkorange: "ff8c00",
|
2022
|
+
darkorchid: "9932cc",
|
2023
|
+
darkred: "8b0000",
|
2024
|
+
darksalmon: "e9967a",
|
2025
|
+
darkseagreen: "8fbc8f",
|
2026
|
+
darkslateblue: "483d8b",
|
2027
|
+
darkslategray: "2f4f4f",
|
2028
|
+
darkslategrey: "2f4f4f",
|
2029
|
+
darkturquoise: "00ced1",
|
2030
|
+
darkviolet: "9400d3",
|
2031
|
+
deeppink: "ff1493",
|
2032
|
+
deepskyblue: "00bfff",
|
2033
|
+
dimgray: "696969",
|
2034
|
+
dimgrey: "696969",
|
2035
|
+
dodgerblue: "1e90ff",
|
2036
|
+
firebrick: "b22222",
|
2037
|
+
floralwhite: "fffaf0",
|
2038
|
+
forestgreen: "228b22",
|
2039
|
+
fuchsia: "f0f",
|
2040
|
+
gainsboro: "dcdcdc",
|
2041
|
+
ghostwhite: "f8f8ff",
|
2042
|
+
gold: "ffd700",
|
2043
|
+
goldenrod: "daa520",
|
2044
|
+
gray: "808080",
|
2045
|
+
green: "008000",
|
2046
|
+
greenyellow: "adff2f",
|
2047
|
+
grey: "808080",
|
2048
|
+
honeydew: "f0fff0",
|
2049
|
+
hotpink: "ff69b4",
|
2050
|
+
indianred: "cd5c5c",
|
2051
|
+
indigo: "4b0082",
|
2052
|
+
ivory: "fffff0",
|
2053
|
+
khaki: "f0e68c",
|
2054
|
+
lavender: "e6e6fa",
|
2055
|
+
lavenderblush: "fff0f5",
|
2056
|
+
lawngreen: "7cfc00",
|
2057
|
+
lemonchiffon: "fffacd",
|
2058
|
+
lightblue: "add8e6",
|
2059
|
+
lightcoral: "f08080",
|
2060
|
+
lightcyan: "e0ffff",
|
2061
|
+
lightgoldenrodyellow: "fafad2",
|
2062
|
+
lightgray: "d3d3d3",
|
2063
|
+
lightgreen: "90ee90",
|
2064
|
+
lightgrey: "d3d3d3",
|
2065
|
+
lightpink: "ffb6c1",
|
2066
|
+
lightsalmon: "ffa07a",
|
2067
|
+
lightseagreen: "20b2aa",
|
2068
|
+
lightskyblue: "87cefa",
|
2069
|
+
lightslategray: "789",
|
2070
|
+
lightslategrey: "789",
|
2071
|
+
lightsteelblue: "b0c4de",
|
2072
|
+
lightyellow: "ffffe0",
|
2073
|
+
lime: "0f0",
|
2074
|
+
limegreen: "32cd32",
|
2075
|
+
linen: "faf0e6",
|
2076
|
+
magenta: "f0f",
|
2077
|
+
maroon: "800000",
|
2078
|
+
mediumaquamarine: "66cdaa",
|
2079
|
+
mediumblue: "0000cd",
|
2080
|
+
mediumorchid: "ba55d3",
|
2081
|
+
mediumpurple: "9370db",
|
2082
|
+
mediumseagreen: "3cb371",
|
2083
|
+
mediumslateblue: "7b68ee",
|
2084
|
+
mediumspringgreen: "00fa9a",
|
2085
|
+
mediumturquoise: "48d1cc",
|
2086
|
+
mediumvioletred: "c71585",
|
2087
|
+
midnightblue: "191970",
|
2088
|
+
mintcream: "f5fffa",
|
2089
|
+
mistyrose: "ffe4e1",
|
2090
|
+
moccasin: "ffe4b5",
|
2091
|
+
navajowhite: "ffdead",
|
2092
|
+
navy: "000080",
|
2093
|
+
oldlace: "fdf5e6",
|
2094
|
+
olive: "808000",
|
2095
|
+
olivedrab: "6b8e23",
|
2096
|
+
orange: "ffa500",
|
2097
|
+
orangered: "ff4500",
|
2098
|
+
orchid: "da70d6",
|
2099
|
+
palegoldenrod: "eee8aa",
|
2100
|
+
palegreen: "98fb98",
|
2101
|
+
paleturquoise: "afeeee",
|
2102
|
+
palevioletred: "db7093",
|
2103
|
+
papayawhip: "ffefd5",
|
2104
|
+
peachpuff: "ffdab9",
|
2105
|
+
peru: "cd853f",
|
2106
|
+
pink: "ffc0cb",
|
2107
|
+
plum: "dda0dd",
|
2108
|
+
powderblue: "b0e0e6",
|
2109
|
+
purple: "800080",
|
2110
|
+
rebeccapurple: "663399",
|
2111
|
+
red: "f00",
|
2112
|
+
rosybrown: "bc8f8f",
|
2113
|
+
royalblue: "4169e1",
|
2114
|
+
saddlebrown: "8b4513",
|
2115
|
+
salmon: "fa8072",
|
2116
|
+
sandybrown: "f4a460",
|
2117
|
+
seagreen: "2e8b57",
|
2118
|
+
seashell: "fff5ee",
|
2119
|
+
sienna: "a0522d",
|
2120
|
+
silver: "c0c0c0",
|
2121
|
+
skyblue: "87ceeb",
|
2122
|
+
slateblue: "6a5acd",
|
2123
|
+
slategray: "708090",
|
2124
|
+
slategrey: "708090",
|
2125
|
+
snow: "fffafa",
|
2126
|
+
springgreen: "00ff7f",
|
2127
|
+
steelblue: "4682b4",
|
2128
|
+
tan: "d2b48c",
|
2129
|
+
teal: "008080",
|
2130
|
+
thistle: "d8bfd8",
|
2131
|
+
tomato: "ff6347",
|
2132
|
+
turquoise: "40e0d0",
|
2133
|
+
violet: "ee82ee",
|
2134
|
+
wheat: "f5deb3",
|
2135
|
+
white: "fff",
|
2136
|
+
whitesmoke: "f5f5f5",
|
2137
|
+
yellow: "ff0",
|
2138
|
+
yellowgreen: "9acd32"
|
2139
|
+
};
|
1855
2140
|
|
1856
|
-
|
1857
|
-
|
2141
|
+
// Make it easy to access colors via `hexNames[hex]`
|
2142
|
+
var hexNames = tinycolor.hexNames = flip(names);
|
1858
2143
|
|
1859
|
-
// Take input from [0, n] and return it as [0, 1]
|
1860
|
-
function bound01(n, max) {
|
1861
|
-
if (isOnePointZero(n)) { n = "100%"; }
|
1862
2144
|
|
1863
|
-
|
1864
|
-
|
2145
|
+
// Utilities
|
2146
|
+
// ---------
|
1865
2147
|
|
1866
|
-
|
1867
|
-
|
1868
|
-
|
2148
|
+
// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
|
2149
|
+
function flip(o) {
|
2150
|
+
var flipped = { };
|
2151
|
+
for (var i in o) {
|
2152
|
+
if (o.hasOwnProperty(i)) {
|
2153
|
+
flipped[o[i]] = i;
|
1869
2154
|
}
|
2155
|
+
}
|
2156
|
+
return flipped;
|
2157
|
+
}
|
1870
2158
|
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
}
|
2159
|
+
// Return a valid alpha value [0,1] with all invalid values being set to 1
|
2160
|
+
function boundAlpha(a) {
|
2161
|
+
a = parseFloat(a);
|
1875
2162
|
|
1876
|
-
|
1877
|
-
|
2163
|
+
if (isNaN(a) || a < 0 || a > 1) {
|
2164
|
+
a = 1;
|
1878
2165
|
}
|
1879
2166
|
|
1880
|
-
|
1881
|
-
|
1882
|
-
return mathMin(1, mathMax(0, val));
|
1883
|
-
}
|
2167
|
+
return a;
|
2168
|
+
}
|
1884
2169
|
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1888
|
-
}
|
2170
|
+
// Take input from [0, n] and return it as [0, 1]
|
2171
|
+
function bound01(n, max) {
|
2172
|
+
if (isOnePointZero(n)) { n = "100%"; }
|
1889
2173
|
|
1890
|
-
|
1891
|
-
|
1892
|
-
function isOnePointZero(n) {
|
1893
|
-
return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
|
1894
|
-
}
|
2174
|
+
var processPercent = isPercentage(n);
|
2175
|
+
n = mathMin(max, mathMax(0, parseFloat(n)));
|
1895
2176
|
|
1896
|
-
//
|
1897
|
-
|
1898
|
-
|
2177
|
+
// Automatically convert percentage into number
|
2178
|
+
if (processPercent) {
|
2179
|
+
n = parseInt(n * max, 10) / 100;
|
1899
2180
|
}
|
1900
2181
|
|
1901
|
-
//
|
1902
|
-
|
1903
|
-
return
|
2182
|
+
// Handle floating point rounding errors
|
2183
|
+
if ((math.abs(n - max) < 0.000001)) {
|
2184
|
+
return 1;
|
1904
2185
|
}
|
1905
2186
|
|
1906
|
-
//
|
1907
|
-
|
1908
|
-
|
1909
|
-
n = (n * 100) + "%";
|
1910
|
-
}
|
2187
|
+
// Convert into [0, 1] range if it isn't already
|
2188
|
+
return (n % max) / parseFloat(max);
|
2189
|
+
}
|
1911
2190
|
|
1912
|
-
|
1913
|
-
|
2191
|
+
// Force a number between 0 and 1
|
2192
|
+
function clamp01(val) {
|
2193
|
+
return mathMin(1, mathMax(0, val));
|
2194
|
+
}
|
1914
2195
|
|
1915
|
-
|
2196
|
+
// Parse a base-16 hex value into a base-10 integer
|
2197
|
+
function parseIntFromHex(val) {
|
2198
|
+
return parseInt(val, 16);
|
2199
|
+
}
|
1916
2200
|
|
1917
|
-
|
1918
|
-
|
2201
|
+
// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
|
2202
|
+
// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
|
2203
|
+
function isOnePointZero(n) {
|
2204
|
+
return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
|
2205
|
+
}
|
1919
2206
|
|
1920
|
-
|
1921
|
-
|
2207
|
+
// Check to see if string passed in is a percentage
|
2208
|
+
function isPercentage(n) {
|
2209
|
+
return typeof n === "string" && n.indexOf('%') != -1;
|
2210
|
+
}
|
1922
2211
|
|
1923
|
-
|
1924
|
-
|
2212
|
+
// Force a hex value to have 2 characters
|
2213
|
+
function pad2(c) {
|
2214
|
+
return c.length == 1 ? '0' + c : '' + c;
|
2215
|
+
}
|
1925
2216
|
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
2217
|
+
// Replace a decimal with it's percentage value
|
2218
|
+
function convertToPercentage(n) {
|
2219
|
+
if (n <= 1) {
|
2220
|
+
n = (n * 100) + "%";
|
2221
|
+
}
|
1931
2222
|
|
1932
|
-
|
1933
|
-
|
1934
|
-
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
|
1935
|
-
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
|
1936
|
-
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
|
1937
|
-
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
|
1938
|
-
hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
|
1939
|
-
hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
|
1940
|
-
};
|
1941
|
-
})();
|
2223
|
+
return n;
|
2224
|
+
}
|
1942
2225
|
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
2226
|
+
// Converts a decimal to a hex value
|
2227
|
+
function convertDecimalToHex(d) {
|
2228
|
+
return Math.round(parseFloat(d) * 255).toString(16);
|
2229
|
+
}
|
2230
|
+
// Converts a hex value to a decimal
|
2231
|
+
function convertHexToDecimal(h) {
|
2232
|
+
return (parseIntFromHex(h) / 255);
|
2233
|
+
}
|
1947
2234
|
|
1948
|
-
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
|
1953
|
-
|
1954
|
-
|
1955
|
-
|
1956
|
-
|
2235
|
+
var matchers = (function() {
|
2236
|
+
|
2237
|
+
// <http://www.w3.org/TR/css3-values/#integers>
|
2238
|
+
var CSS_INTEGER = "[-\\+]?\\d+%?";
|
2239
|
+
|
2240
|
+
// <http://www.w3.org/TR/css3-values/#number-value>
|
2241
|
+
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
|
2242
|
+
|
2243
|
+
// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
|
2244
|
+
var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
|
2245
|
+
|
2246
|
+
// Actual matching.
|
2247
|
+
// Parentheses and commas are optional, but not required.
|
2248
|
+
// Whitespace can take the place of commas or opening paren
|
2249
|
+
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
|
2250
|
+
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
|
2251
|
+
|
2252
|
+
return {
|
2253
|
+
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
|
2254
|
+
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
|
2255
|
+
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
|
2256
|
+
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
|
2257
|
+
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
|
2258
|
+
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
|
2259
|
+
hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
|
2260
|
+
hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
|
2261
|
+
hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
|
2262
|
+
};
|
2263
|
+
})();
|
1957
2264
|
|
1958
|
-
|
1959
|
-
|
1960
|
-
|
1961
|
-
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
if ((match = matchers.hsla.exec(color))) {
|
1973
|
-
return { h: match[1], s: match[2], l: match[3], a: match[4] };
|
1974
|
-
}
|
1975
|
-
if ((match = matchers.hsv.exec(color))) {
|
1976
|
-
return { h: match[1], s: match[2], v: match[3] };
|
1977
|
-
}
|
1978
|
-
if ((match = matchers.hex6.exec(color))) {
|
1979
|
-
return {
|
1980
|
-
r: parseHex(match[1]),
|
1981
|
-
g: parseHex(match[2]),
|
1982
|
-
b: parseHex(match[3]),
|
1983
|
-
format: named ? "name" : "hex"
|
1984
|
-
};
|
1985
|
-
}
|
1986
|
-
if ((match = matchers.hex3.exec(color))) {
|
1987
|
-
return {
|
1988
|
-
r: parseHex(match[1] + '' + match[1]),
|
1989
|
-
g: parseHex(match[2] + '' + match[2]),
|
1990
|
-
b: parseHex(match[3] + '' + match[3]),
|
1991
|
-
format: named ? "name" : "hex"
|
1992
|
-
};
|
1993
|
-
}
|
2265
|
+
// `stringInputToObject`
|
2266
|
+
// Permissive string parsing. Take in a number of formats, and output an object
|
2267
|
+
// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
|
2268
|
+
function stringInputToObject(color) {
|
2269
|
+
|
2270
|
+
color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();
|
2271
|
+
var named = false;
|
2272
|
+
if (names[color]) {
|
2273
|
+
color = names[color];
|
2274
|
+
named = true;
|
2275
|
+
}
|
2276
|
+
else if (color == 'transparent') {
|
2277
|
+
return { r: 0, g: 0, b: 0, a: 0, format: "name" };
|
2278
|
+
}
|
1994
2279
|
|
1995
|
-
|
2280
|
+
// Try to match string input using regular expressions.
|
2281
|
+
// Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
|
2282
|
+
// Just return an object and let the conversion functions handle that.
|
2283
|
+
// This way the result will be the same whether the tinycolor is initialized with string or object.
|
2284
|
+
var match;
|
2285
|
+
if ((match = matchers.rgb.exec(color))) {
|
2286
|
+
return { r: match[1], g: match[2], b: match[3] };
|
2287
|
+
}
|
2288
|
+
if ((match = matchers.rgba.exec(color))) {
|
2289
|
+
return { r: match[1], g: match[2], b: match[3], a: match[4] };
|
2290
|
+
}
|
2291
|
+
if ((match = matchers.hsl.exec(color))) {
|
2292
|
+
return { h: match[1], s: match[2], l: match[3] };
|
2293
|
+
}
|
2294
|
+
if ((match = matchers.hsla.exec(color))) {
|
2295
|
+
return { h: match[1], s: match[2], l: match[3], a: match[4] };
|
2296
|
+
}
|
2297
|
+
if ((match = matchers.hsv.exec(color))) {
|
2298
|
+
return { h: match[1], s: match[2], v: match[3] };
|
2299
|
+
}
|
2300
|
+
if ((match = matchers.hsva.exec(color))) {
|
2301
|
+
return { h: match[1], s: match[2], v: match[3], a: match[4] };
|
2302
|
+
}
|
2303
|
+
if ((match = matchers.hex8.exec(color))) {
|
2304
|
+
return {
|
2305
|
+
a: convertHexToDecimal(match[1]),
|
2306
|
+
r: parseIntFromHex(match[2]),
|
2307
|
+
g: parseIntFromHex(match[3]),
|
2308
|
+
b: parseIntFromHex(match[4]),
|
2309
|
+
format: named ? "name" : "hex8"
|
2310
|
+
};
|
2311
|
+
}
|
2312
|
+
if ((match = matchers.hex6.exec(color))) {
|
2313
|
+
return {
|
2314
|
+
r: parseIntFromHex(match[1]),
|
2315
|
+
g: parseIntFromHex(match[2]),
|
2316
|
+
b: parseIntFromHex(match[3]),
|
2317
|
+
format: named ? "name" : "hex"
|
2318
|
+
};
|
2319
|
+
}
|
2320
|
+
if ((match = matchers.hex3.exec(color))) {
|
2321
|
+
return {
|
2322
|
+
r: parseIntFromHex(match[1] + '' + match[1]),
|
2323
|
+
g: parseIntFromHex(match[2] + '' + match[2]),
|
2324
|
+
b: parseIntFromHex(match[3] + '' + match[3]),
|
2325
|
+
format: named ? "name" : "hex"
|
2326
|
+
};
|
1996
2327
|
}
|
1997
2328
|
|
1998
|
-
|
1999
|
-
|
2329
|
+
return false;
|
2330
|
+
}
|
2000
2331
|
|
2332
|
+
window.tinycolor = tinycolor;
|
2001
2333
|
})();
|
2002
2334
|
|
2003
|
-
|
2004
2335
|
$(function () {
|
2005
2336
|
if ($.fn.spectrum.load) {
|
2006
2337
|
$.fn.spectrum.processNativeColorInputs();
|
2007
2338
|
}
|
2008
2339
|
});
|
2009
2340
|
|
2010
|
-
})
|
2341
|
+
});
|