├── DisplayWithWebsockets ├── DisplayWithWebsockets.ino └── secret.h ├── README.md └── Web Interface ├── index.html └── jqColorPicker.min.js /DisplayWithWebsockets/DisplayWithWebsockets.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | Basic Websocket Example 3 | 4 | Written by Brian Lough 5 | https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA 6 | 7 | June 5th, 2018 - Added !rect, !line & !circle - Seon Rozenblum (Unexpected maker) 8 | *******************************************************************/ 9 | 10 | #include "secret.h" 11 | 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | 18 | // ---------------------------- 19 | // Standard Libraries - Already Installed if you have ESP8266 set up 20 | // ---------------------------- 21 | 22 | #include 23 | 24 | // ---------------------------- 25 | // Additional Libraries - each one of these will need to be installed. 26 | // ---------------------------- 27 | 28 | 29 | #include 30 | // The library for controlling the LED Matrix 31 | // Needs to be manually downloaded and installed 32 | // https://github.com/2dom/PxMatrix 33 | 34 | #define ELEMENTS(x) (sizeof(x) / sizeof(x[0])) 35 | 36 | Ticker display_ticker; 37 | 38 | // Pins for LED MATRIX 39 | #define P_LAT 16 40 | #define P_A 5 41 | #define P_B 4 42 | #define P_C 15 43 | #define P_OE 2 44 | #define P_D 12 45 | #define P_E 0 46 | 47 | // PxMATRIX display(32,16,P_LAT, P_OE,P_A,P_B,P_C); 48 | // PxMATRIX display(64,32,P_LAT, P_OE,P_A,P_B,P_C,P_D); 49 | PxMATRIX display(64, 32, P_LAT, P_OE, P_A, P_B, P_C, P_D, P_E); 50 | 51 | //------- Replace the following! ------ 52 | char ssid[] = WIFI_NAME; // your network SSID (name) 53 | char password[] = WIFI_PASS; // your network key 54 | 55 | WebSocketsServer webSocket = WebSocketsServer(81); 56 | 57 | void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { 58 | char xArray[4]; 59 | int x; 60 | int y; 61 | int w; 62 | int h; 63 | uint16_t colour; 64 | int commaCount = 0; 65 | String inPayload; 66 | String colourString; 67 | 68 | int commas[] = {-1,-1,-1,-1}; // using 4 for now 69 | int command; 70 | switch (type) { 71 | case WStype_DISCONNECTED: 72 | Serial.printf("[%u] Disconnected!\n", num); 73 | break; 74 | case WStype_CONNECTED: 75 | { 76 | IPAddress ip = webSocket.remoteIP(num); 77 | Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); 78 | 79 | // send message to client 80 | webSocket.sendTXT(num, "Connected"); 81 | } 82 | break; 83 | case WStype_TEXT: 84 | // Serial.printf("[%u] get Text: %s\n", num, payload); 85 | inPayload = String((char *) payload); 86 | Serial.println(inPayload); 87 | 88 | if (inPayload == "CLEAR") { 89 | clearDisplay(); 90 | } else { 91 | 92 | // clear commas 93 | // need to makr this use size of 94 | for ( int i = 0; i < ELEMENTS(commas); i++ ) 95 | commas[i] = -1; 96 | 97 | // grab all comma positions 98 | int commaIndex = 0; 99 | for (int i = 0; i < inPayload.length(); i++ ) 100 | { 101 | if ( inPayload[i] == ',' ) 102 | commas[ commaIndex++ ] = i; 103 | } 104 | 105 | /* commands 106 | 0 = draw 107 | 1 = rect 108 | 2 = line 109 | 3 = cirle 110 | 4 = text ????? 111 | */ 112 | 113 | // grab command 114 | int commandSeperator = inPayload.indexOf(":"); 115 | command = inPayload.substring(0,commandSeperator).toInt(); 116 | Serial.println(command); 117 | 118 | x = inPayload.substring(commandSeperator+1, commas[0]).toInt(); 119 | y = inPayload.substring(commas[0] + 1, commas[1]).toInt(); 120 | 121 | Serial.print(x); 122 | Serial.print(","); 123 | Serial.println(y); 124 | 125 | if ( command == 0 ) // draw pixel 126 | { 127 | colourString = inPayload.substring(commas[1] + 1); 128 | Serial.println(colourString); 129 | colour = strtol(colourString.c_str(), NULL, 0); 130 | Serial.println(colour); 131 | display.drawPixel(x , y, colour); 132 | } 133 | else if ( command == 1 ) // rect 134 | { 135 | w = inPayload.substring(commas[1] + 1, commas[2]).toInt(); 136 | h = inPayload.substring(commas[2] + 1, commas[3]).toInt(); 137 | colourString = inPayload.substring(commas[3] + 1); 138 | colour = strtol(colourString.c_str(), NULL, 0); 139 | 140 | display.drawRect( x, y, w, h, colour ); 141 | 142 | } 143 | else if ( command == 2 ) // line 144 | { 145 | w = inPayload.substring(commas[1] + 1, commas[2]).toInt(); 146 | h = inPayload.substring(commas[2] + 1, commas[3]).toInt(); 147 | colourString = inPayload.substring(commas[3] + 1); 148 | colour = strtol(colourString.c_str(), NULL, 0); 149 | 150 | display.drawLine( x, y, w, h, colour ); 151 | } 152 | else if ( command == 3 ) // circle 153 | { 154 | w = inPayload.substring(commas[1] + 1, commas[2]).toInt(); 155 | colourString = inPayload.substring(commas[2] + 1); 156 | colour = strtol(colourString.c_str(), NULL, 0); 157 | 158 | display.drawCircle( x, y, w, colour ); 159 | } 160 | 161 | 162 | 163 | 164 | 165 | // Serial.print("X: "); 166 | // Serial.println(x); 167 | // Serial.print("Y: "); 168 | // Serial.println(y); 169 | // Serial.print("Colour: "); 170 | // Serial.println(colour, HEX); 171 | 172 | 173 | } 174 | 175 | 176 | // send message to client 177 | // webSocket.sendTXT(num, "message here"); 178 | 179 | // send data to all connected clients 180 | // webSocket.broadcastTXT("message here"); 181 | break; 182 | case WStype_BIN: 183 | Serial.printf("[%u] get binary length: %u\n", num, length); 184 | hexdump(payload, length); 185 | 186 | // send message to client 187 | // webSocket.sendBIN(num, payload, length); 188 | break; 189 | } 190 | 191 | } 192 | 193 | void display_updater() 194 | { 195 | 196 | display.display(70); 197 | 198 | } 199 | 200 | void clearDisplay(){ 201 | for(int i = 0; i < 64; i++){ 202 | for(int j = 0; j < 32; j++){ 203 | display.drawPixel(i , j, 0x0000); 204 | } 205 | } 206 | } 207 | 208 | void setup() { 209 | 210 | Serial.begin(115200); 211 | 212 | display.begin(16); 213 | display.clearDisplay(); 214 | 215 | display_ticker.attach(0.002, display_updater); 216 | yield(); 217 | 218 | // Set WiFi to station mode and disconnect from an AP if it was Previously 219 | // connected 220 | WiFi.mode(WIFI_STA); 221 | WiFi.disconnect(); 222 | delay(100); 223 | 224 | // Attempt to connect to Wifi network: 225 | Serial.print("Connecting Wifi: "); 226 | Serial.println(ssid); 227 | WiFi.begin(ssid, password); 228 | while (WiFi.status() != WL_CONNECTED) { 229 | Serial.print("."); 230 | delay(500); 231 | } 232 | Serial.println(""); 233 | Serial.println("WiFi connected"); 234 | Serial.println("IP address: "); 235 | IPAddress ip = WiFi.localIP(); 236 | Serial.println(ip); 237 | 238 | webSocket.begin(); 239 | webSocket.onEvent(webSocketEvent); 240 | } 241 | 242 | void loop() { 243 | webSocket.loop(); 244 | 245 | } 246 | -------------------------------------------------------------------------------- /DisplayWithWebsockets/secret.h: -------------------------------------------------------------------------------- 1 | #define WIFI_NAME "SSID" 2 | #define WIFI_PASS "PASSWORD" 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ESP8266-Led-Matrix-Web-Draw 2 | Draw on your LED Matrix using a web interface 3 | 4 | ![stream](https://i.imgur.com/O87D9ze.jpg) 5 | 6 | ![stream](https://i.imgur.com/F2ybAhu.jpg) 7 | 8 | Still a WIP project 9 | 10 | Feel free to reach out if you have any questions: 11 | 12 | - [YouTube](https://www.youtube.com/c/BrianLough) 13 | - [Twitch](https://www.twitch.tv/brianlough) 14 | - [Twitter](https://twitter.com/witnessmenow) 15 | 16 | Huge thanks to David Watts for providing the base for the web interface code! Check out his channel [here](https://www.youtube.com/user/MrDavidJWatts) 17 | 18 | ### Instructions 19 | 20 | - Instructions for getting set up with the display can be found [here](https://youtu.be/YvU_ZfF7vs4). Wring [here](https://raw.githubusercontent.com/witnessmenow/LED-Matrix-Mario-Display/master/Wiring.png) 21 | - Download this repo 22 | - Open up "DisplayWithWebscokets" in the Arduino IDE. 23 | - Update secret.h with your WiFi details. 24 | - Upload the sketch to your board. 25 | - Check what IP address it received via the serial monitor. 26 | - Edit "Web Interface/index.html" to change the IP address `new WebSocket("ws://192.168.1.31:81");` 27 | - Open index.html with your web browser 28 | - start drawing! 29 | 30 | ### Next steps 31 | 32 | - Put web interface on ESP8266 33 | - ~~Add support for dragging the cursor to paint many squares~~ - Done 34 | - Add ability to sync display to web interface 35 | - Add the ability to load/save drawings 36 | - Add Export to code option 37 | - Too many to list them all! 38 | -------------------------------------------------------------------------------- /Web Interface/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 69 | 70 | LED Matrix WebDraw 71 | 72 | 73 | 74 | 75 | 76 | 77 |
78 |
79 | 80 |
81 |
82 | 193 |

194 | 195 | 196 | 197 | -------------------------------------------------------------------------------- /Web Interface/jqColorPicker.min.js: -------------------------------------------------------------------------------- 1 | /*! tinyColorPicker - v1.1.1 2016-08-30 */ 2 | 3 | !function(a,b){"object"==typeof exports?module.exports=b(a):"function"==typeof define&&define.amd?define("colors",[],function(){return b(a)}):a.Colors=b(a)}(this,function(a,b){"use strict";function c(a,c,d,f,g){if("string"==typeof c){var c=v.txt2color(c);d=c.type,p[d]=c[d],g=g!==b?g:c.alpha}else if(c)for(var h in c)a[d][h]=k(c[h]/l[d][h][1],0,1);return g!==b&&(a.alpha=k(+g,0,1)),e(d,f?a:b)}function d(a,b,c){var d=o.options.grey,e={};return e.RGB={r:a.r,g:a.g,b:a.b},e.rgb={r:b.r,g:b.g,b:b.b},e.alpha=c,e.equivalentGrey=n(d.r*a.r+d.g*a.g+d.b*a.b),e.rgbaMixBlack=i(b,{r:0,g:0,b:0},c,1),e.rgbaMixWhite=i(b,{r:1,g:1,b:1},c,1),e.rgbaMixBlack.luminance=h(e.rgbaMixBlack,!0),e.rgbaMixWhite.luminance=h(e.rgbaMixWhite,!0),o.options.customBG&&(e.rgbaMixCustom=i(b,o.options.customBG,c,1),e.rgbaMixCustom.luminance=h(e.rgbaMixCustom,!0),o.options.customBG.luminance=h(o.options.customBG,!0)),e}function e(a,b){var c,e,k,q=b||p,r=v,s=o.options,t=l,u=q.RND,w="",x="",y={hsl:"hsv",rgb:a},z=u.rgb;if("alpha"!==a){for(var A in t)if(!t[A][A]){a!==A&&(x=y[A]||"rgb",q[A]=r[x+"2"+A](q[x])),u[A]||(u[A]={}),c=q[A];for(w in c)u[A][w]=n(c[w]*t[A][w][1])}z=u.rgb,q.HEX=r.RGB2HEX(z),q.equivalentGrey=s.grey.r*q.rgb.r+s.grey.g*q.rgb.g+s.grey.b*q.rgb.b,q.webSave=e=f(z,51),q.webSmart=k=f(z,17),q.saveColor=z.r===e.r&&z.g===e.g&&z.b===e.b?"web save":z.r===k.r&&z.g===k.g&&z.b===k.b?"web smart":"",q.hueRGB=v.hue2RGB(q.hsv.h),b&&(q.background=d(z,q.rgb,q.alpha))}var B,C,D,E=q.rgb,F=q.alpha,G="luminance",H=q.background;return B=i(E,{r:0,g:0,b:0},F,1),B[G]=h(B,!0),q.rgbaMixBlack=B,C=i(E,{r:1,g:1,b:1},F,1),C[G]=h(C,!0),q.rgbaMixWhite=C,s.customBG&&(D=i(E,H.rgbaMixCustom,F,1),D[G]=h(D,!0),D.WCAG2Ratio=j(D[G],H.rgbaMixCustom[G]),q.rgbaMixBGMixCustom=D,D.luminanceDelta=m.abs(D[G]-H.rgbaMixCustom[G]),D.hueDelta=g(H.rgbaMixCustom,D,!0)),q.RGBLuminance=h(z),q.HUELuminance=h(q.hueRGB),s.convertCallback&&s.convertCallback(q,a),q}function f(a,b){var c={},d=0,e=b/2;for(var f in a)d=a[f]%b,c[f]=a[f]+(d>e?b-d:-d);return c}function g(a,b,c){return(m.max(a.r-b.r,b.r-a.r)+m.max(a.g-b.g,b.g-a.g)+m.max(a.b-b.b,b.b-a.b))*(c?255:1)/765}function h(a,b){for(var c=b?1:255,d=[a.r/c,a.g/c,a.b/c],e=o.options.luminance,f=d.length;f--;)d[f]=d[f]<=.03928?d[f]/12.92:m.pow((d[f]+.055)/1.055,2.4);return e.r*d[0]+e.g*d[1]+e.b*d[2]}function i(a,c,d,e){var f={},g=d!==b?d:1,h=e!==b?e:1,i=g+h*(1-g);for(var j in a)f[j]=(a[j]*g+c[j]*h*(1-g))/i;return f.a=i,f}function j(a,b){var c=1;return c=a>=b?(a+.05)/(b+.05):(b+.05)/(a+.05),n(100*c)/100}function k(a,b,c){return a>c?c:b>a?b:a}var l={rgb:{r:[0,255],g:[0,255],b:[0,255]},hsv:{h:[0,360],s:[0,100],v:[0,100]},hsl:{h:[0,360],s:[0,100],l:[0,100]},alpha:{alpha:[0,1]},HEX:{HEX:[0,16777215]}},m=a.Math,n=m.round,o={},p={},q={r:.298954,g:.586434,b:.114612},r={r:.2126,g:.7152,b:.0722},s=function(a){this.colors={RND:{}},this.options={color:"rgba(0,0,0,0)",grey:q,luminance:r,valueRanges:l},t(this,a||{})},t=function(a,d){var e,f=a.options;u(a);for(var g in d)d[g]!==b&&(f[g]=d[g]);e=f.customBG,f.customBG="string"==typeof e?v.txt2color(e).rgb:e,p=c(a.colors,f.color,b,!0)},u=function(a){o!==a&&(o=a,p=a.colors)};s.prototype.setColor=function(a,d,f){return u(this),a?c(this.colors,a,d,b,f):(f!==b&&(this.colors.alpha=k(f,0,1)),e(d))},s.prototype.setCustomBackground=function(a){return u(this),this.options.customBG="string"==typeof a?v.txt2color(a).rgb:a,c(this.colors,b,"rgb")},s.prototype.saveAsBackground=function(){return u(this),c(this.colors,b,"rgb",!0)},s.prototype.toString=function(a,b){return v.color2text((a||"rgb").toLowerCase(),this.colors,b)};var v={txt2color:function(a){var b={},c=a.replace(/(?:#|\)|%)/g,"").split("("),d=(c[1]||"").split(/,\s*/),e=c[1]?c[0].substr(0,3):"rgb",f="";if(b.type=e,b[e]={},c[1])for(var g=3;g--;)f=e[g]||e.charAt(g),b[e][f]=+d[g]/l[e][f][1];else b.rgb=v.HEX2rgb(c[0]);return b.alpha=d[3]?+d[3]:1,b},color2text:function(a,b,c){var d=c!==!1&&n(100*b.alpha)/100,e="number"==typeof d&&c!==!1&&(c||1!==d),f=b.RND.rgb,g=b.RND.hsl,h="hex"===a&&e,i="hex"===a&&!h,j="rgb"===a||h,k=j?f.r+", "+f.g+", "+f.b:i?"#"+b.HEX:g.h+", "+g.s+"%, "+g.l+"%";return i?k:(h?"rgb":a)+(e?"a":"")+"("+k+(e?", "+d:"")+")"},RGB2HEX:function(a){return((a.r<16?"0":"")+a.r.toString(16)+(a.g<16?"0":"")+a.g.toString(16)+(a.b<16?"0":"")+a.b.toString(16)).toUpperCase()},HEX2rgb:function(a){return a=a.split(""),{r:+("0x"+a[0]+a[a[3]?1:0])/255,g:+("0x"+a[a[3]?2:1]+(a[3]||a[1]))/255,b:+("0x"+(a[4]||a[2])+(a[5]||a[2]))/255}},hue2RGB:function(a){var b=6*a,c=~~b%6,d=6===b?0:b-c;return{r:n(255*[1,1-d,0,0,d,1][c]),g:n(255*[d,1,1,1-d,0,0][c]),b:n(255*[0,0,d,1,1,1-d][c])}},rgb2hsv:function(a){var b,c,d,e=a.r,f=a.g,g=a.b,h=0;return g>f&&(f=g+(g=f,0),h=-1),c=g,f>e&&(e=f+(f=e,0),h=-2/6-h,c=m.min(f,g)),b=e-c,d=e?b/e:0,{h:1e-15>d?p&&p.hsl&&p.hsl.h||0:b?m.abs(h+(f-g)/(6*b)):0,s:e?b/e:p&&p.hsv&&p.hsv.s||0,v:e}},hsv2rgb:function(a){var b=6*a.h,c=a.s,d=a.v,e=~~b,f=b-e,g=d*(1-c),h=d*(1-f*c),i=d*(1-(1-f)*c),j=e%6;return{r:[d,h,g,g,i,d][j],g:[i,d,d,h,g,g][j],b:[g,g,i,d,d,h][j]}},hsv2hsl:function(a){var b=(2-a.s)*a.v,c=a.s*a.v;return c=a.s?1>b?b?c/b:0:c/(2-b):0,{h:a.h,s:a.v||c?c:p&&p.hsl&&p.hsl.s||0,l:b/2}},rgb2hsl:function(a,b){var c=v.rgb2hsv(a);return v.hsv2hsl(b?c:p.hsv=c)},hsl2rgb:function(a){var b=6*a.h,c=a.s,d=a.l,e=.5>d?d*(1+c):d+c-c*d,f=d+d-e,g=e?(e-f)/e:0,h=~~b,i=b-h,j=e*g*i,k=f+j,l=e-j,m=h%6;return{r:[e,l,f,f,k,e][m],g:[k,e,e,l,f,f][m],b:[f,f,k,e,e,l][m]}}};return s}),function(a,b){"object"==typeof exports?module.exports=b(a,require("jquery"),require("colors")):"function"==typeof define&&define.amd?define(["jquery","colors"],function(c,d){return b(a,c,d)}):b(a,a.jQuery,a.Colors)}(this,function(a,b,c,d){"use strict";function e(a){return a.value||a.getAttribute("value")||b(a).css("background-color")||"#FFF"}function f(a){return a=a.originalEvent&&a.originalEvent.touches?a.originalEvent.touches[0]:a,a.originalEvent?a.originalEvent:a}function g(a){return b(a.find(r.doRender)[0]||a[0])}function h(c){var d=b(this),f=d.offset(),h=b(a),k=r.gap;c?(s=g(d),s._colorMode=s.data("colorMode"),p.$trigger=d,(t||i()).css(r.positionCallback.call(p,d)||{left:(t._left=f.left)-((t._left+=t._width-(h.scrollLeft()+h.width()))+k>0?t._left+k:0),top:(t._top=f.top+d.outerHeight())-((t._top+=t._height-(h.scrollTop()+h.height()))+k>0?t._top+k:0)}).show(r.animationSpeed,function(){c!==!0&&(y.toggle(!!r.opacity)._width=y.width(),v._width=v.width(),v._height=v.height(),u._height=u.height(),q.setColor(e(s[0])),n(!0))}).off(".tcp").on(D,".cp-xy-slider,.cp-z-slider,.cp-alpha",j)):p.$trigger&&b(t).hide(r.animationSpeed,function(){n(!1),p.$trigger=null}).off(".tcp")}function i(){return b("head")[r.cssPrepend?"prepend":"append"]('"),b(H).css({margin:r.margin}).appendTo("body").show(0,function(){p.$UI=t=b(this),F=r.GPU&&t.css("perspective")!==d,u=b(".cp-z-slider",this),v=b(".cp-xy-slider",this),w=b(".cp-xy-cursor",this),x=b(".cp-z-cursor",this),y=b(".cp-alpha",this),z=b(".cp-alpha-cursor",this),r.buildCallback.call(p,t),t.prepend("
").children().eq(0).css("width",t.children().eq(0).width()),t._width=this.offsetWidth,t._height=this.offsetHeight}).hide()}function j(a){var c=this.className.replace(/cp-(.*?)(?:\s*|$)/,"$1").replace("-","_");(a.button||a.which)>1||(a.preventDefault&&a.preventDefault(),a.returnValue=!1,s._offset=b(this).offset(),(c="xy_slider"===c?k:"z_slider"===c?l:m)(a),n(),A.on(E,function(){A.off(".tcp")}).on(C,function(a){c(a),n()}))}function k(a){var b=f(a),c=b.pageX-s._offset.left,d=b.pageY-s._offset.top;q.setColor({s:c/v._width*100,v:100-d/v._height*100},"hsv")}function l(a){var b=f(a).pageY-s._offset.top;q.setColor({h:360-b/u._height*360},"hsv")}function m(a){var b=f(a).pageX-s._offset.left,c=b/y._width;q.setColor({},"rgb",c)}function n(a){var b=q.colors,c=b.hueRGB,e=(b.RND.rgb,b.RND.hsl,r.dark),f=r.light,g=q.toString(s._colorMode,r.forceAlpha),h=b.HUELuminance>.22?e:f,i=b.rgbaMixBlack.luminance>.22?e:f,j=(1-b.hsv.h)*u._height,k=b.hsv.s*v._width,l=(1-b.hsv.v)*v._height,m=b.alpha*y._width,n=F?"translate3d":"",p=s[0].value,t=s[0].hasAttribute("value")&&""===p&&a!==d;v._css={backgroundColor:"rgb("+c.r+","+c.g+","+c.b+")"},w._css={transform:n+"("+k+"px, "+l+"px, 0)",left:F?"":k,top:F?"":l,borderColor:b.RGBLuminance>.22?e:f},x._css={transform:n+"(0, "+j+"px, 0)",top:F?"":j,borderColor:"transparent "+h},y._css={backgroundColor:"#"+b.HEX},z._css={transform:n+"("+m+"px, 0, 0)",left:F?"":m,borderColor:i+" transparent"},s._css={backgroundColor:t?"":g,color:t?"":b.rgbaMixBGMixCustom.luminance>.22?e:f},s.text=t?"":p!==g?g:"",a!==d?o(a):G(o)}function o(a){v.css(v._css),w.css(w._css),x.css(x._css),y.css(y._css),z.css(z._css),r.doRender&&s.css(s._css),s.text&&s.val(s.text),r.renderCallback.call(p,s,"boolean"==typeof a?a:d)}var p,q,r,s,t,u,v,w,x,y,z,A=b(document),B=b(),C="touchmove.tcp mousemove.tcp pointermove.tcp",D="touchstart.tcp mousedown.tcp pointerdown.tcp",E="touchend.tcp mouseup.tcp pointerup.tcp",F=!1,G=a.requestAnimationFrame||a.webkitRequestAnimationFrame||function(a){a()},H='
',I=".cp-color-picker{position:absolute;overflow:hidden;padding:6px 6px 0;background-color:#444;color:#bbb;font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:400;cursor:default;border-radius:5px}.cp-color-picker>div{position:relative;overflow:hidden}.cp-xy-slider{float:left;height:128px;width:128px;margin-bottom:6px;background:linear-gradient(to right,#FFF,rgba(255,255,255,0))}.cp-white{height:100%;width:100%;background:linear-gradient(rgba(0,0,0,0),#000)}.cp-xy-cursor{position:absolute;top:0;width:10px;height:10px;margin:-5px;border:1px solid #fff;border-radius:100%;box-sizing:border-box}.cp-z-slider{float:right;margin-left:6px;height:128px;width:20px;background:linear-gradient(red 0,#f0f 17%,#00f 33%,#0ff 50%,#0f0 67%,#ff0 83%,red 100%)}.cp-z-cursor{position:absolute;margin-top:-4px;width:100%;border:4px solid #fff;border-color:transparent #fff;box-sizing:border-box}.cp-alpha{clear:both;width:100%;height:16px;margin:6px 0;background:linear-gradient(to right,#444,rgba(0,0,0,0))}.cp-alpha-cursor{position:absolute;margin-left:-4px;height:100%;border:4px solid #fff;border-color:#fff transparent;box-sizing:border-box}",J=function(a){q=this.color=new c(a),r=q.options,p=this};J.prototype={render:n,toggle:h},b.fn.colorPicker=function(c){var d=this,f=function(){};return c=b.extend({animationSpeed:150,GPU:!0,doRender:!0,customBG:"#FFF",opacity:!0,renderCallback:f,buildCallback:f,positionCallback:f,body:document.body,scrollResize:!0,gap:4,dark:"#222",light:"#DDD"},c),!p&&c.scrollResize&&b(a).on("resize.tcp scroll.tcp",function(){p.$trigger&&p.toggle.call(p.$trigger[0],!0)}),B=B.add(this),this.colorPicker=p||new J(c),this.options=c,b(c.body).off(".tcp").on(D,function(a){-1===B.add(t).add(b(t).find(a.target)).index(a.target)&&h()}),this.on("focusin.tcp click.tcp",function(a){p.color.options=b.extend(p.color.options,r=d.options),h.call(this,a)}).on("change.tcp",function(){q.setColor(this.value||"#FFF"),d.colorPicker.render(!0)}).each(function(){var a=e(this),d=a.split("("),f=g(b(this));f.data("colorMode",d[1]?d[0].substr(0,3):"HEX").attr("readonly",r.preventFocus),c.doRender&&f.css({"background-color":a,color:function(){return q.setColor(a).rgbaMixBGMixCustom.luminance>.22?c.dark:c.light}})})},b.fn.colorPicker.destroy=function(){b("*").off(".tcp"),p.toggle(!1),B=b()}}); 4 | //# sourceMappingURL=jqColorPicker.js.map --------------------------------------------------------------------------------