PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 2.2.0
Page Builder: Pagelayer – Drag and Drop website builder v2.2.0
2.2.1 2.2.0 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 trunk 0.9.0 0.9.1 0.9.2 0.9.3 0.9.4 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.0.2 1.0.3 1.0.4 1.0.5 All 129 releases
pagelayer / js / vanilla-picker.js

vanilla-picker.js in Page Builder: Pagelayer – Drag and Drop website builder 2.2.0, at js/vanilla-picker.js

1,152 lines 39.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*!
2 * vanilla-picker v2.7.2 (MODIFIED by Pagelayer)
3 * https://vanilla-picker.js.org
4 *
5 * Copyright 2017-2019 Andreas Borgen (https://github.com/Sphinxxxx), Adam Brooks (https://github.com/dissimulate)
6 * Released under the ISC license.
7 */
8 (function (global, factory) {
9 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
10 typeof define === 'function' && define.amd ? define(factory) :
11 (global.Picker = factory());
12 }(this, (function () { 'use strict';
13
14 var classCallCheck = function (instance, Constructor) {
15 if (!(instance instanceof Constructor)) {
16 throw new TypeError("Cannot call a class as a function");
17 }
18 };
19
20 var createClass = function () {
21 function defineProperties(target, props) {
22 for (var i = 0; i < props.length; i++) {
23 var descriptor = props[i];
24 descriptor.enumerable = descriptor.enumerable || false;
25 descriptor.configurable = true;
26 if ("value" in descriptor) descriptor.writable = true;
27 Object.defineProperty(target, descriptor.key, descriptor);
28 }
29 }
30
31 return function (Constructor, protoProps, staticProps) {
32 if (protoProps) defineProperties(Constructor.prototype, protoProps);
33 if (staticProps) defineProperties(Constructor, staticProps);
34 return Constructor;
35 };
36 }();
37
38 var slicedToArray = function () {
39 function sliceIterator(arr, i) {
40 var _arr = [];
41 var _n = true;
42 var _d = false;
43 var _e = undefined;
44
45 try {
46 for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
47 _arr.push(_s.value);
48
49 if (i && _arr.length === i) break;
50 }
51 } catch (err) {
52 _d = true;
53 _e = err;
54 } finally {
55 try {
56 if (!_n && _i["return"]) _i["return"]();
57 } finally {
58 if (_d) throw _e;
59 }
60 }
61
62 return _arr;
63 }
64
65 return function (arr, i) {
66 if (Array.isArray(arr)) {
67 return arr;
68 } else if (Symbol.iterator in Object(arr)) {
69 return sliceIterator(arr, i);
70 } else {
71 throw new TypeError("Invalid attempt to destructure non-iterable instance");
72 }
73 };
74 }();
75
76 String.prototype.startsWith = String.prototype.startsWith || function (needle) {
77 return this.indexOf(needle) === 0;
78 };
79 String.prototype.padStart = String.prototype.padStart || function (len, pad) {
80 var str = this;while (str.length < len) {
81 str = pad + str;
82 }return str;
83 };
84
85 var colorNames = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', 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: '#ff00ff', 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: '#778899', lightslategrey: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff', whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32' };
86
87 function printNum(num) {
88 var decs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
89
90 var str = decs > 0 ? num.toFixed(decs).replace(/0+$/, '').replace(/\.$/, '') : num.toString();
91 return str || '0';
92 }
93
94 var Color = function () {
95 function Color(r, g, b, a) {
96 classCallCheck(this, Color);
97
98
99 var that = this;
100 function parseString(input) {
101
102 if (input.startsWith('hsl')) {
103 var _input$match$map = input.match(/([\-\d\.e]+)/g).map(Number),
104 _input$match$map2 = slicedToArray(_input$match$map, 4),
105 h = _input$match$map2[0],
106 s = _input$match$map2[1],
107 l = _input$match$map2[2],
108 _a = _input$match$map2[3];
109
110 if (_a === undefined) {
111 _a = 1;
112 }
113
114 h /= 360;
115 s /= 100;
116 l /= 100;
117 that.hsla = [h, s, l, _a];
118 }
119
120 else if (input.startsWith('rgb')) {
121 var _input$match$map3 = input.match(/([\-\d\.e]+)/g).map(Number),
122 _input$match$map4 = slicedToArray(_input$match$map3, 4),
123 _r = _input$match$map4[0],
124 _g = _input$match$map4[1],
125 _b = _input$match$map4[2],
126 _a2 = _input$match$map4[3];
127
128 if (_a2 === undefined) {
129 _a2 = 1;
130 }
131
132 that.rgba = [_r, _g, _b, _a2];
133 }
134
135 else {
136 if (input.startsWith('#')) {
137 that.rgba = Color.hexToRgb(input);
138 } else {
139 that.rgba = Color.nameToRgb(input) || Color.hexToRgb(input);
140 }
141 }
142 }
143
144 if (r === undefined) ;
145
146
147 else if (Array.isArray(r)) {
148 this.rgba = r;
149 }
150
151 else if (b === undefined) {
152 var color = r && '' + r;
153 if (color) {
154 parseString(color.toLowerCase());
155 }
156 } else {
157 this.rgba = [r, g, b, a === undefined ? 1 : a];
158 }
159 }
160
161
162 createClass(Color, [{
163 key: 'printRGB',
164 value: function printRGB(alpha) {
165 var rgb = alpha ? this.rgba : this.rgba.slice(0, 3),
166 vals = rgb.map(function (x, i) {
167 return printNum(x, i === 3 ? 3 : 0);
168 });
169
170 return alpha ? 'rgba(' + vals + ')' : 'rgb(' + vals + ')';
171 }
172 }, {
173 key: 'printHSL',
174 value: function printHSL(alpha) {
175 var mults = [360, 100, 100, 1],
176 suff = ['', '%', '%', ''];
177
178 var hsl = alpha ? this.hsla : this.hsla.slice(0, 3),
179
180 vals = hsl.map(function (x, i) {
181 return printNum(x * mults[i], i === 3 ? 3 : 1) + suff[i];
182 });
183
184 return alpha ? 'hsla(' + vals + ')' : 'hsl(' + vals + ')';
185 }
186 }, {
187 key: 'printHex',
188 value: function printHex(alpha) {
189 var hex = this.hex;
190 return alpha ? hex : hex.substring(0, 7);
191 }
192
193
194
195 }, {
196 key: 'rgba',
197 get: function get$$1() {
198 if (this._rgba) {
199 return this._rgba;
200 }
201 if (!this._hsla) {
202 throw new Error('No color is set');
203 }
204
205 return this._rgba = Color.hslToRgb(this._hsla);
206 },
207 set: function set$$1(rgb) {
208 if (rgb.length === 3) {
209 rgb[3] = 1;
210 }
211
212 this._rgba = rgb;
213 this._hsla = null;
214 }
215 }, {
216 key: 'rgbString',
217 get: function get$$1() {
218 return this.printRGB();
219 }
220 }, {
221 key: 'rgbaString',
222 get: function get$$1() {
223 return this.printRGB(true);
224 }
225
226
227 }, {
228 key: 'hsla',
229 get: function get$$1() {
230 if (this._hsla) {
231 return this._hsla;
232 }
233 if (!this._rgba) {
234 throw new Error('No color is set');
235 }
236
237 return this._hsla = Color.rgbToHsl(this._rgba);
238 },
239 set: function set$$1(hsl) {
240 if (hsl.length === 3) {
241 hsl[3] = 1;
242 }
243
244 this._hsla = hsl;
245 this._rgba = null;
246 }
247 }, {
248 key: 'hslString',
249 get: function get$$1() {
250 return this.printHSL();
251 }
252 }, {
253 key: 'hslaString',
254 get: function get$$1() {
255 return this.printHSL(true);
256 }
257
258
259 }, {
260 key: 'hex',
261 get: function get$$1() {
262 var rgb = this.rgba,
263 hex = rgb.map(function (x, i) {
264 return i < 3 ? x.toString(16) : Math.round(x * 255).toString(16);
265 });
266
267 return '#' + hex.map(function (x) {
268 return x.padStart(2, '0');
269 }).join('');
270 },
271 set: function set$$1(hex) {
272 this.rgba = Color.hexToRgb(hex);
273 }
274 }], [{
275 key: 'hexToRgb',
276 value: function hexToRgb(input) {
277 var hex = (input.startsWith('#') ? input.slice(1) : input).replace(/^(\w{3})$/, '$1F')
278 .replace(/^(\w)(\w)(\w)(\w)$/, '$1$1$2$2$3$3$4$4')
279 .replace(/^(\w{6})$/, '$1FF');
280
281 if (!hex.match(/^([0-9a-fA-F]{8})$/)) {
282 throw new Error('Unknown hex color; ' + input);
283 }
284
285 var rgba = hex.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1)
286 .map(function (x) {
287 return parseInt(x, 16);
288 });
289
290 rgba[3] = rgba[3] / 255;
291 return rgba;
292 }
293
294
295 }, {
296 key: 'nameToRgb',
297 value: function nameToRgb(input) {
298 var hex = colorNames[input];
299 if (hex) {
300 return Color.hexToRgb(hex);
301 }
302 }
303
304
305 }, {
306 key: 'rgbToHsl',
307 value: function rgbToHsl(_ref) {
308 var _ref2 = slicedToArray(_ref, 4),
309 r = _ref2[0],
310 g = _ref2[1],
311 b = _ref2[2],
312 a = _ref2[3];
313
314 r /= 255;
315 g /= 255;
316 b /= 255;
317
318 var max = Math.max(r, g, b),
319 min = Math.min(r, g, b);
320 var h = void 0,
321 s = void 0,
322 l = (max + min) / 2;
323
324 if (max === min) {
325 h = s = 0;
326 } else {
327 var d = max - min;
328 s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
329 switch (max) {
330 case r:
331 h = (g - b) / d + (g < b ? 6 : 0);break;
332 case g:
333 h = (b - r) / d + 2;break;
334 case b:
335 h = (r - g) / d + 4;break;
336 }
337
338 h /= 6;
339 }
340
341 return [h, s, l, a];
342 }
343
344
345 }, {
346 key: 'hslToRgb',
347 value: function hslToRgb(_ref3) {
348 var _ref4 = slicedToArray(_ref3, 4),
349 h = _ref4[0],
350 s = _ref4[1],
351 l = _ref4[2],
352 a = _ref4[3];
353
354 var r = void 0,
355 g = void 0,
356 b = void 0;
357
358 if (s === 0) {
359 r = g = b = l;
360 } else {
361 var hue2rgb = function hue2rgb(p, q, t) {
362 if (t < 0) t += 1;
363 if (t > 1) t -= 1;
364 if (t < 1 / 6) return p + (q - p) * 6 * t;
365 if (t < 1 / 2) return q;
366 if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
367 return p;
368 };
369
370 var q = l < 0.5 ? l * (1 + s) : l + s - l * s,
371 p = 2 * l - q;
372
373 r = hue2rgb(p, q, h + 1 / 3);
374 g = hue2rgb(p, q, h);
375 b = hue2rgb(p, q, h - 1 / 3);
376 }
377
378 var rgba = [r * 255, g * 255, b * 255].map(Math.round);
379 rgba[3] = a;
380
381 return rgba;
382 }
383 }]);
384 return Color;
385 }();
386
387 var root = window;
388
389 function dragTracker(options) {
390
391
392 var ep = Element.prototype;
393 if (!ep.matches) ep.matches = ep.msMatchesSelector || ep.webkitMatchesSelector;
394 if (!ep.closest) ep.closest = function (s) {
395 var node = this;
396 do {
397 if (node.matches(s)) return node;
398 node = node.tagName === 'svg' ? node.parentNode : node.parentElement;
399 } while (node);
400
401 return null;
402 };
403
404 options = options || {};
405 var container = options.container || options.doc.documentElement,
406 selector = options.selector,
407 callback = options.callback || console.log,
408 callbackStart = options.callbackDragStart,
409 callbackEnd = options.callbackDragEnd,
410
411 callbackClick = options.callbackClick,
412 propagate = options.propagateEvents,
413 roundCoords = options.roundCoords !== false,
414 dragOutside = options.dragOutside !== false,
415
416 handleOffset = options.handleOffset || options.handleOffset !== false;
417 var offsetToCenter = null;
418 switch (handleOffset) {
419 case 'center':
420 offsetToCenter = true;break;
421 case 'topleft':
422 case 'top-left':
423 offsetToCenter = false;break;
424 }
425
426 var dragState = void 0;
427
428 function getMousePos(e, elm, offset, stayWithin) {
429 var x = e.clientX,
430 y = e.clientY;
431
432 function respectBounds(value, min, max) {
433 return Math.max(min, Math.min(value, max));
434 }
435
436 if (elm) {
437 var bounds = elm.getBoundingClientRect();
438 x -= bounds.left;
439 y -= bounds.top;
440
441 if (offset) {
442 x -= offset[0];
443 y -= offset[1];
444 }
445 if (stayWithin) {
446 x = respectBounds(x, 0, bounds.width);
447 y = respectBounds(y, 0, bounds.height);
448 }
449
450 if (elm !== container) {
451 var center = offsetToCenter !== null ? offsetToCenter
452 : elm.nodeName === 'circle' || elm.nodeName === 'ellipse';
453
454 if (center) {
455 x -= bounds.width / 2;
456 y -= bounds.height / 2;
457 }
458 }
459 }
460 return roundCoords ? [Math.round(x), Math.round(y)] : [x, y];
461 }
462
463 function stopEvent(e) {
464 e.preventDefault();
465 if (!propagate) {
466 e.stopPropagation();
467 }
468 }
469
470 function onDown(e) {
471 var target = void 0;
472 if (selector) {
473 target = selector instanceof Element ? selector.contains(e.target) ? selector : null : e.target.closest(selector);
474 } else {
475 target = {};
476 }
477
478 if (target) {
479 stopEvent(e);
480
481 var mouseOffset = selector && handleOffset ? getMousePos(e, target) : [0, 0],
482 startPos = getMousePos(e, container, mouseOffset);
483 dragState = {
484 target: target,
485 mouseOffset: mouseOffset,
486 startPos: startPos,
487 actuallyDragged: false
488 };
489
490 if (callbackStart) {
491 callbackStart(target, startPos);
492 }
493 }
494 }
495
496 function onMove(e) {
497 if (!dragState) {
498 return;
499 }
500 stopEvent(e);
501
502 var start = dragState.startPos,
503 pos = getMousePos(e, container, dragState.mouseOffset, !dragOutside);
504
505 dragState.actuallyDragged = dragState.actuallyDragged || start[0] !== pos[0] || start[1] !== pos[1];
506
507 callback(dragState.target, pos, start);
508 }
509
510 function onEnd(e, cancelled) {
511 if (!dragState) {
512 return;
513 }
514
515 if (callbackEnd || callbackClick) {
516 var isClick = !dragState.actuallyDragged,
517 pos = isClick ? dragState.startPos : getMousePos(e, container, dragState.mouseOffset, !dragOutside);
518
519 if (callbackClick && isClick && !cancelled) {
520 callbackClick(dragState.target, pos);
521 }
522 if (callbackEnd) {
523 callbackEnd(dragState.target, pos, dragState.startPos, cancelled || isClick && callbackClick);
524 }
525 }
526 dragState = null;
527 }
528
529
530 addEvent(container, 'mousedown', function (e) {
531 if (isLeftButton(e)) {
532 onDown(e);
533 } else {
534 onEnd(e, true);
535 }
536 });
537 addEvent(container, 'touchstart', function (e) {
538 return relayTouch(e, onDown);
539 });
540
541 addEvent(container, 'mousemove', function (e) {
542 if (!dragState) {
543 return;
544 }
545
546 if (isLeftButton(e)) {
547 onMove(e);
548 }
549 else {
550 onEnd(e);
551 }
552 });
553 addEvent(container, 'touchmove', function (e) {
554 return relayTouch(e, onMove);
555 });
556
557 addEvent(container, 'mouseup', function (e) {
558 if (dragState && !isLeftButton(e)) {
559 onEnd(e);
560 }
561 });
562 function onTouchEnd(e, cancelled) {
563 onEnd(tweakTouch(e), cancelled);
564 }
565 addEvent(container, 'touchend', function (e) {
566 return onTouchEnd(e);
567 });
568 addEvent(container, 'touchcancel', function (e) {
569 return onTouchEnd(e, true);
570 });
571
572 function addEvent(target, type, handler) {
573 target.addEventListener(type, handler);
574 }
575 function isLeftButton(e) {
576 return e.buttons !== undefined ? e.buttons === 1 :
577 e.which === 1;
578 }
579 function relayTouch(e, handler) {
580 if (e.touches.length !== 1) {
581 onEnd(e, true);return;
582 }
583
584 handler(tweakTouch(e));
585 }
586 function tweakTouch(e) {
587 var touch = e.targetTouches[0];
588 if (!touch) {
589 touch = e.changedTouches[0];
590 }
591
592 touch.preventDefault = e.preventDefault.bind(e);
593 touch.stopPropagation = e.stopPropagation.bind(e);
594 return touch;
595 }
596 }
597
598
599 var BG_TRANSP = 'url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'2\' height=\'2\'%3E%3Cpath d=\'M1,0H0V1H2V2H1\' fill=\'lightgrey\'/%3E%3C/svg%3E")';
600 var HUES = 360;
601 var EVENT_KEY = 'keydown',
602 EVENT_CLICK_OUTSIDE = 'mousedown',
603 EVENT_TAB_MOVE = 'focusin';
604
605 function parseHTML(htmlString, doc) {
606 doc = doc || document;
607 var div = doc.createElement('div');
608 div.innerHTML = htmlString;
609 return div.firstElementChild;
610 }
611
612 function $(selector, context) {
613 return (context || document).querySelector(selector);
614 }
615
616 function addEvent(target, type, handler) {
617 target.addEventListener(type, handler, false);
618 }
619 function stopEvent(e) {
620 e.preventDefault();
621 e.stopPropagation();
622 }
623 function onKey(target, keys, handler, stop) {
624 addEvent(target, EVENT_KEY, function (e) {
625 if (keys.indexOf(e.key) >= 0) {
626 if (stop) {
627 stopEvent(e);
628 }
629 handler(e);
630 }
631 });
632 }
633
634 // Add the CSS
635 function appendCSS(doc){
636 doc = doc || document;
637 if(doc.querySelector('#vanilla-picker-style')){
638 return;
639 }
640
641 var style = document.createElement('style');
642 style.id = 'vanilla-picker-style';
643
644 doc.documentElement.firstElementChild
645 .appendChild(style).textContent = '.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.layout_default.picker_wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:\'\';display:block;width:100%;height:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.layout_default .picker_sl::before{content:\'\';display:block;padding-bottom:100%}.layout_default .picker_editor{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;width:6rem}.layout_default .picker_editor input{width:calc(100% + 2px);height:calc(100% + 2px)}.layout_default .picker_sample{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.layout_default .picker_done{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.picker_wrapper{-webkit-box-sizing:border-box;box-sizing:border-box;background:#f2f2f2;-webkit-box-shadow:0 0 0 1px silver;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{margin:-1px}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid white;border-radius:100%;-webkit-box-shadow:0 0 3px 1px #67b9ff;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:-webkit-gradient(linear, left top, right top, from(red), color-stop(yellow), color-stop(lime), color-stop(cyan), color-stop(blue), color-stop(magenta), to(red));background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);-webkit-box-shadow:0 0 0 1px silver;box-shadow:0 0 0 1px silver}.picker_sl{position:relative;-webkit-box-shadow:0 0 0 1px silver;box-shadow:0 0 0 1px silver;background-image:-webkit-gradient(linear, left top, left bottom, from(white), color-stop(50%, rgba(255,255,255,0))),-webkit-gradient(linear, left bottom, left top, from(black), color-stop(50%, rgba(0,0,0,0))),-webkit-gradient(linear, left top, right top, from(gray), to(rgba(128,128,128,0)));background-image:linear-gradient(180deg, white, rgba(255,255,255,0) 50%),linear-gradient(0deg, black, rgba(0,0,0,0) 50%),linear-gradient(90deg, gray, rgba(128,128,128,0))}.picker_alpha,.picker_sample{position:relative;background:url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'2\' height=\'2\'%3E%3Cpath d=\'M1,0H0V1H2V2H1\' fill=\'lightgrey\'/%3E%3C/svg%3E") left top/contain white;-webkit-box-shadow:0 0 0 1px silver;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:monospace;padding:.1em .2em}.picker_sample::before{content:\'\';position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_done button{-webkit-box-sizing:border-box;box-sizing:border-box;padding:.2em .5em;cursor:pointer}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;-webkit-box-shadow:0 0 10px 1px rgba(0,0,0,0.4);box-shadow:0 0 10px 1px rgba(0,0,0,0.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;-webkit-box-shadow:none;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}';
646
647 }
648
649 var Picker = function () {
650
651
652 function Picker(options) {
653 var _this = this;
654
655 classCallCheck(this, Picker);
656
657 options = options || {};
658
659 this.settings = {
660 popup: 'right',
661 layout: 'default',
662 alpha: true,
663 editor: true,
664 editorFormat: 'hex',
665 doc: options.doc || document
666 };
667
668 this._openProxy = function (e) {
669 return _this.openHandler(e);
670 };
671
672 this.onChange = null;
673 this.onDone = null;
674 this.onOpen = null;
675 this.onClose = null;
676
677 appendCSS(options.doc || document);
678
679 this.setOptions(options);
680 }
681
682
683
684 createClass(Picker, [{
685 key: 'setOptions',
686 value: function setOptions(options) {
687 if (!options) {
688 return;
689 }
690 var settings = this.settings;
691
692 function transfer(source, target, skipKeys) {
693 for (var key in source) {
694 if (skipKeys && skipKeys.indexOf(key) >= 0) {
695 continue;
696 }
697
698 target[key] = source[key];
699 }
700 }
701
702 if (options instanceof HTMLElement) {
703 settings.parent = options;
704 } else {
705
706
707 if (settings.parent && options.parent && settings.parent !== options.parent) {
708 settings.parent.removeEventListener('click', this._openProxy, false);
709 this._popupInited = false;
710 }
711
712 transfer(options, settings );
713
714 if (options.onChange) {
715 this.onChange = options.onChange;
716 }
717 if (options.onDone) {
718 this.onDone = options.onDone;
719 }
720 if (options.onOpen) {
721 this.onOpen = options.onOpen;
722 }
723 if (options.onClose) {
724 this.onClose = options.onClose;
725 }
726
727 var col = options.color || options.colour;
728 if (col) {
729 this._setColor(col);
730 }
731 }
732
733 var parent = settings.parent;
734 if (parent && settings.popup && !this._popupInited) {
735
736 addEvent(parent, 'click', this._openProxy);
737
738 onKey(parent, [' ', 'Spacebar', 'Enter'], this._openProxy );
739
740
741 this._popupInited = true;
742 } else if (options.parent && !settings.popup) {
743 this.show();
744 }
745 }
746
747
748 }, {
749 key: 'openHandler',
750 value: function openHandler(e) {
751 if (this.show()) {
752 e && e.preventDefault();
753
754 this.settings.parent.style.pointerEvents = 'none';
755
756 var toFocus = e && e.type === EVENT_KEY ? this._domEdit : this.domElement;
757 setTimeout(function () {
758 return toFocus.focus();
759 }, 100);
760
761 if (this.onOpen) {
762 this.onOpen(this.colour);
763 }
764 }
765 }
766
767
768 }, {
769 key: 'closeHandler',
770 value: function closeHandler(e) {
771 var event = e && e.type;
772 var doHide = false;
773
774 if (!e) {
775 doHide = true;
776 }
777 else if (event === EVENT_CLICK_OUTSIDE || event === EVENT_TAB_MOVE) {
778
779 if (!this.domElement.contains(e.target)) {
780 doHide = true;
781 }
782 }
783 else {
784 stopEvent(e);
785
786 doHide = true;
787 }
788
789 if (doHide && this.hide()) {
790 this.settings.parent.style.pointerEvents = '';
791
792 if (event !== EVENT_CLICK_OUTSIDE) {
793 this.settings.parent.focus();
794 }
795
796 if (this.onClose) {
797 this.onClose(this.colour);
798 }
799 }
800 }
801
802
803 }, {
804 key: 'movePopup',
805 value: function movePopup(options, open) {
806 this.closeHandler();
807
808 this.setOptions(options);
809 if (open) {
810 this.openHandler();
811 }
812 }
813
814
815 }, {
816 key: 'setColor',
817 value: function setColor(color, silent) {
818 this._setColor(color, { silent: silent });
819 }
820 }, {
821 key: '_setColor',
822 value: function _setColor(color, flags) {
823 if (typeof color === 'string') {
824 color = color.trim();
825 }
826 if (!color) {
827 return;
828 }
829
830 flags = flags || {};
831 var c = void 0;
832 try {
833 c = new Color(color);
834 } catch (ex) {
835 if (flags.failSilently) {
836 return;
837 }
838 throw ex;
839 }
840
841 if (!this.settings.alpha) {
842 var hsla = c.hsla;
843 hsla[3] = 1;
844 c.hsla = hsla;
845 }
846 this.colour = this.color = c;
847 this._setHSLA(null, null, null, null, flags);
848 }
849
850 }, {
851 key: 'setColour',
852 value: function setColour(colour, silent) {
853 this.setColor(colour, silent);
854 }
855
856
857 }, {
858 key: 'show',
859 value: function show() {
860 var parent = this.settings.parent;
861 if (!parent) {
862 return false;
863 }
864
865 if (this.domElement) {
866 var toggled = this._toggleDOM(true);
867
868 this._setPosition();
869
870 return toggled;
871 }
872
873 var html = this.settings.template || '<div class="picker_wrapper" tabindex="-1"><div class="picker_arrow"></div><div class="picker_hue picker_slider"><div class="picker_selector"></div></div><div class="picker_sl"><div class="picker_selector"></div></div><div class="picker_alpha picker_slider"><div class="picker_selector"></div></div><div class="picker_editor"><input aria-label="Type a color name or hex value"/></div><div class="picker_sample"></div><div class="picker_done"><button>Ok</button></div></div>';
874 var wrapper = parseHTML(html, this.settings.doc);
875
876 this.domElement = wrapper;
877 this._domH = $('.picker_hue', wrapper);
878 this._domSL = $('.picker_sl', wrapper);
879 this._domA = $('.picker_alpha', wrapper);
880 this._domEdit = $('.picker_editor input', wrapper);
881 this._domSample = $('.picker_sample', wrapper);
882 this._domOkay = $('.picker_done button', wrapper);
883
884 wrapper.classList.add('layout_' + this.settings.layout);
885 if (!this.settings.alpha) {
886 wrapper.classList.add('no_alpha');
887 }
888 if (!this.settings.editor) {
889 wrapper.classList.add('no_editor');
890 }
891 this._ifPopup(function () {
892 return wrapper.classList.add('popup');
893 });
894
895 this._setPosition();
896
897 if (this.colour) {
898 this._updateUI();
899 } else {
900 this._setColor('#0cf');
901 }
902 this._bindEvents();
903
904 return true;
905 }
906
907
908 }, {
909 key: 'hide',
910 value: function hide() {
911 return this._toggleDOM(false);
912 }
913
914
915 }, {
916 key: '_bindEvents',
917 value: function _bindEvents() {
918 var _this2 = this;
919
920 var that = this,
921 dom = this.domElement;
922
923 addEvent(dom, 'click', function (e) {
924 return e.preventDefault();
925 });
926
927
928 function createDragConfig(container, callbackRelative) {
929
930 function relayDrag(_, pos) {
931 var relX = pos[0] / container.clientWidth,
932 relY = pos[1] / container.clientHeight;
933 callbackRelative(relX, relY);
934 }
935
936 var config = {
937 container: container,
938 dragOutside: false,
939 callback: relayDrag,
940 callbackDragStart: relayDrag,
941 propagateEvents: true
942 };
943 return config;
944 }
945
946 dragTracker(createDragConfig(this._domH, function (x, y) {
947 return that._setHSLA(x);
948 }));
949
950 dragTracker(createDragConfig(this._domSL, function (x, y) {
951 return that._setHSLA(null, x, 1 - y);
952 }));
953
954 if (this.settings.alpha) {
955 dragTracker(createDragConfig(this._domA, function (x, y) {
956 return that._setHSLA(null, null, null, 1 - y);
957 }));
958 }
959
960
961 var editInput = this._domEdit;
962 {
963 addEvent(editInput, 'input', function (e) {
964 that._setColor(this.value, { fromEditor: true, failSilently: true });
965 });
966 addEvent(editInput, 'focus', function (e) {
967 var input = this;
968 if (input.selectionStart === input.selectionEnd) {
969 input.select();
970 }
971 });
972 }
973
974
975 var popupCloseProxy = function popupCloseProxy(e) {
976 _this2._ifPopup(function () {
977 return _this2.closeHandler(e);
978 });
979 };
980 var onDoneProxy = function onDoneProxy(e) {
981 _this2._ifPopup(function () {
982 return _this2.closeHandler(e);
983 });
984 if (_this2.onDone) {
985 _this2.onDone(_this2.colour);
986 }
987 };
988
989 addEvent(this.settings.doc || document, EVENT_CLICK_OUTSIDE, popupCloseProxy);
990 addEvent(this.settings.doc || document, EVENT_TAB_MOVE, popupCloseProxy);
991 onKey(dom, ['Esc', 'Escape'], popupCloseProxy);
992
993 addEvent(this._domOkay, 'click', onDoneProxy);
994 onKey(dom, ['Enter'], onDoneProxy);
995 }
996
997
998 }, {
999 key: '_setPosition',
1000 value: function _setPosition() {
1001 var parent = this.settings.parent,
1002 elm = this.domElement;
1003
1004 if (parent !== elm.parentNode) {
1005 parent.appendChild(elm);
1006 }
1007
1008 this._ifPopup(function (popup) {
1009
1010 if (getComputedStyle(parent).position === 'static') {
1011 parent.style.position = 'relative';
1012 }
1013
1014 var cssClass = popup === true ? 'popup_right' : 'popup_' + popup;
1015
1016 ['popup_top', 'popup_bottom', 'popup_left', 'popup_right'].forEach(function (c) {
1017 if (c === cssClass) {
1018 elm.classList.add(c);
1019 } else {
1020 elm.classList.remove(c);
1021 }
1022 });
1023
1024 elm.classList.add(cssClass);
1025 });
1026 }
1027
1028
1029 }, {
1030 key: '_setHSLA',
1031 value: function _setHSLA(h, s, l, a, flags) {
1032 flags = flags || {};
1033
1034 var col = this.colour,
1035 hsla = col.hsla;
1036
1037 [h, s, l, a].forEach(function (x, i) {
1038 if (x || x === 0) {
1039 hsla[i] = x;
1040 }
1041 });
1042 col.hsla = hsla;
1043
1044 this._updateUI(flags);
1045
1046 if (this.onChange && !flags.silent) {
1047 this.onChange(col);
1048 }
1049 }
1050 }, {
1051 key: '_updateUI',
1052 value: function _updateUI(flags) {
1053 if (!this.domElement) {
1054 return;
1055 }
1056 flags = flags || {};
1057
1058 var col = this.colour,
1059 hsl = col.hsla,
1060 cssHue = 'hsl(' + hsl[0] * HUES + ', 100%, 50%)',
1061 cssHSL = col.hslString,
1062 cssHSLA = col.hslaString;
1063
1064 var uiH = this._domH,
1065 uiSL = this._domSL,
1066 uiA = this._domA,
1067 thumbH = $('.picker_selector', uiH),
1068 thumbSL = $('.picker_selector', uiSL),
1069 thumbA = $('.picker_selector', uiA);
1070
1071 function posX(parent, child, relX) {
1072 child.style.left = relX * 100 + '%';
1073 }
1074 function posY(parent, child, relY) {
1075 child.style.top = relY * 100 + '%';
1076 }
1077
1078
1079 posX(uiH, thumbH, hsl[0]);
1080
1081 this._domSL.style.backgroundColor = this._domH.style.color = cssHue;
1082
1083
1084 posX(uiSL, thumbSL, hsl[1]);
1085 posY(uiSL, thumbSL, 1 - hsl[2]);
1086
1087 uiSL.style.color = cssHSL;
1088
1089
1090 posY(uiA, thumbA, 1 - hsl[3]);
1091
1092 var opaque = cssHSL,
1093 transp = opaque.replace('hsl', 'hsla').replace(')', ', 0)'),
1094 bg = 'linear-gradient(' + [opaque, transp] + ')';
1095
1096 this._domA.style.backgroundImage = bg + ', ' + BG_TRANSP;
1097
1098
1099 if (!flags.fromEditor) {
1100 var format = this.settings.editorFormat,
1101 alpha = this.settings.alpha;
1102
1103 var value = void 0;
1104 switch (format) {
1105 case 'rgb':
1106 value = col.printRGB(alpha);break;
1107 case 'hsl':
1108 value = col.printHSL(alpha);break;
1109 default:
1110 value = col.printHex(alpha);
1111 }
1112 this._domEdit.value = value;
1113 }
1114
1115
1116 this._domSample.style.color = cssHSLA;
1117 }
1118 }, {
1119 key: '_ifPopup',
1120 value: function _ifPopup(actionIf, actionElse) {
1121 if (this.settings.parent && this.settings.popup) {
1122 actionIf && actionIf(this.settings.popup);
1123 } else {
1124 actionElse && actionElse();
1125 }
1126 }
1127 }, {
1128 key: '_toggleDOM',
1129 value: function _toggleDOM(toVisible) {
1130 var dom = this.domElement;
1131 if (!dom) {
1132 return false;
1133 }
1134
1135 var displayStyle = toVisible ? '' : 'none',
1136 toggle = dom.style.display !== displayStyle;
1137
1138 if (toggle) {
1139 dom.style.display = displayStyle;
1140 }
1141 return toggle;
1142 }
1143
1144
1145 }]);
1146 return Picker;
1147 }();
1148
1149 return Picker;
1150
1151 })));
1152