(function () {
'use strict';
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _construct(Parent, args, Class) {
if (_isNativeReflectConstruct()) {
_construct = Reflect.construct;
} else {
_construct = function _construct(Parent, args, Class) {
var a = [null];
a.push.apply(a, args);
var Constructor = Function.bind.apply(Parent, a);
var instance = new Constructor();
if (Class) _setPrototypeOf(instance, Class.prototype);
return instance;
};
}
return _construct.apply(null, arguments);
}
function _isNativeFunction(fn) {
return Function.toString.call(fn).indexOf("[native code]") !== -1;
}
function _wrapNativeSuper(Class) {
var _cache = typeof Map === "function" ? new Map() : undefined;
_wrapNativeSuper = function _wrapNativeSuper(Class) {
if (Class === null || !_isNativeFunction(Class)) return Class;
if (typeof Class !== "function") {
throw new TypeError("Super expression must either be null or a function");
}
if (typeof _cache !== "undefined") {
if (_cache.has(Class)) return _cache.get(Class);
_cache.set(Class, Wrapper);
}
function Wrapper() {
return _construct(Class, arguments, _getPrototypeOf(this).constructor);
}
Wrapper.prototype = Object.create(Class.prototype, {
constructor: {
value: Wrapper,
enumerable: false,
writable: true,
configurable: true
}
});
return _setPrototypeOf(Wrapper, Class);
};
return _wrapNativeSuper(Class);
}
/**
* Based on:
* Very simple jQuery Color Picker
* Copyright (C) 2012 Tanguy Krotoff
* Licensed under the MIT license
*
* ADAPTED BY: Dimitris Grammatikogiannis
*
* MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
(function (customElements) {
var KEYCODE = {
TAB: 9,
ESC: 27
};
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',
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'
};
var JoomlaFieldSimpleColor = /*#__PURE__*/function (_HTMLElement) {
_inheritsLoose(JoomlaFieldSimpleColor, _HTMLElement);
function JoomlaFieldSimpleColor() {
var _this;
_this = _HTMLElement.call(this) || this; // Define some variables
_this.select = '';
_this.options = [];
_this.icon = '';
_this.panel = '';
_this.buttons = [];
_this.focusableElements = null;
_this.focusableSelectors = ['a[href]', 'area[href]', 'input:not([disabled])', 'select:not([disabled])', 'textarea:not([disabled])', 'button:not([disabled])', 'iframe', 'object', 'embed', '[contenteditable]', '[tabindex]:not([tabindex^="-"])'];
return _this;
}
var _proto = JoomlaFieldSimpleColor.prototype;
_proto.connectedCallback = function connectedCallback() {
var _this2 = this;
this.select = this.querySelector('select');
if (!this.select) {
throw new Error('Simple color field requires a select element');
}
this.options = [].slice.call(this.select.querySelectorAll('option'));
this.select.classList.add('hidden'); // Build the pop up
this.options.forEach(function (option) {
var color = option.value;
var clss = 'swatch';
if (color === 'none') {
clss += ' nocolor';
color = 'transparent';
}
if (option.selected) {
clss += ' active';
}
var el = document.createElement('button');
el.setAttribute('class', clss);
el.style.backgroundColor = color;
el.setAttribute('type', 'button');
var a11yColor = color === 'transparent' ? _this2.textTransp : _this2.getColorName(color);
el.innerHTML = Joomla.sanitizeHtml("" + a11yColor + "");
_this2.buttons.push(el);
}); // Add a close button
var close = document.createElement('button');
close.setAttribute('class', 'btn-close');
close.setAttribute('type', 'button');
close.innerHTML = Joomla.sanitizeHtml(this.textClose);
this.buttons.push(close);
var color = this.select.value;
var clss = '';
if (color === 'none') {
clss += ' nocolor';
color = 'transparent';
}
this.icon = document.createElement('button');
if (clss) {
this.icon.setAttribute('class', clss);
}
var uniqueId = "simple-color-" + Math.random().toString(36).substr(2, 10);
this.icon.setAttribute('type', 'button');
this.icon.setAttribute('tabindex', '0');
this.icon.style.backgroundColor = color;
this.icon.innerHTML = Joomla.sanitizeHtml("" + this.textSelect + "");
this.icon.id = uniqueId;
this.select.insertAdjacentElement('beforebegin', this.icon);
this.icon.addEventListener('click', this.show.bind(this));
this.panel = document.createElement('div');
this.panel.classList.add('simplecolors-panel');
this.panel.setAttribute('aria-labelledby', uniqueId);
this.hide = this.hide.bind(this);
this.colorSelect = this.colorSelect.bind(this);
this.buttons.forEach(function (el) {
if (el.classList.contains('btn-close')) {
el.addEventListener('click', _this2.hide);
} else {
el.addEventListener('click', _this2.colorSelect);
}
_this2.panel.insertAdjacentElement('beforeend', el);
});
this.appendChild(this.panel);
this.focusableElements = [].slice.call(this.panel.querySelectorAll(this.focusableSelectors.join()));
this.keys = this.keys.bind(this);
this.hide = this.hide.bind(this);
this.mousedown = this.mousedown.bind(this);
};
// Show the panel
_proto.show = function show() {
document.addEventListener('mousedown', this.hide);
this.addEventListener('keydown', this.keys);
this.panel.addEventListener('mousedown', this.mousedown);
this.panel.setAttribute('data-open', '');
var focused = this.panel.querySelector('button');
if (focused) {
focused.focus();
}
} // Hide panel
;
_proto.hide = function hide() {
document.removeEventListener('mousedown', this.hide, false);
this.removeEventListener('keydown', this.keys);
if (this.panel.hasAttribute('data-open')) {
this.panel.removeAttribute('data-open');
}
this.icon.focus();
};
_proto.colorSelect = function colorSelect(e) {
var color = '';
var bgcolor = '';
var clss = '';
if (e.target.classList.contains('nocolor')) {
color = 'none';
bgcolor = 'transparent';
clss = 'nocolor';
} else {
color = this.rgb2hex(e.target.style.backgroundColor);
bgcolor = color;
} // Reset the active class
this.buttons.forEach(function (el) {
if (el.classList.contains('active')) {
el.classList.remove('active');
}
}); // Add the active class to the selected button
e.target.classList.add('active');
this.icon.classList.remove('nocolor');
this.icon.setAttribute('class', clss);
this.icon.style.backgroundColor = bgcolor; // trigger change event both on the select and on the custom element
this.select.dispatchEvent(new Event('change'));
this.dispatchEvent(new CustomEvent('change', {
detail: {
value: color
},
bubbles: true
})); // Hide the panel
this.hide(); // Change select value
this.options.forEach(function (el) {
if (el.selected) {
el.removeAttribute('selected');
}
if (el.value === bgcolor) {
el.setAttribute('selected', '');
}
});
};
_proto.keys = function keys(e) {
if (e.keyCode === KEYCODE.ESC) {
this.hide();
}
if (e.keyCode === KEYCODE.TAB) {
// Get the index of the current active element
var focusedIndex = this.focusableElements.indexOf(document.activeElement); // If first element is focused and shiftkey is in use, focus last item within modal
if (e.shiftKey && (focusedIndex === 0 || focusedIndex === -1)) {
this.focusableElements[this.focusableElements.length - 1].focus();
e.preventDefault();
} // If last element is focused and shiftkey is not in use, focus first item within modal
if (!e.shiftKey && focusedIndex === this.focusableElements.length - 1) {
this.focusableElements[0].focus();
e.preventDefault();
}
}
} // Prevents the mousedown event from "eating" the click event.
// eslint-disable-next-line class-methods-use-this
;
_proto.mousedown = function mousedown(e) {
e.stopPropagation();
e.preventDefault();
};
_proto.getColorName = function getColorName(value) {
// Expand any short code
var newValue = value;
if (value.length === 4) {
var tmpValue = value.split('');
newValue = tmpValue[0] + tmpValue[1] + tmpValue[1] + tmpValue[2] + tmpValue[2] + tmpValue[3] + tmpValue[3];
} // eslint-disable-next-line no-restricted-syntax
for (var color in colorNames) {
// eslint-disable-next-line no-prototype-builtins
if (colorNames.hasOwnProperty(color) && newValue.toLowerCase() === colorNames[color]) {
return color;
}
}
return this.textColor + " " + value.replace('#', '').split('').join(', ');
}
/**
* Converts a RGB color to its hexadecimal value.
* See http://stackoverflow.com/questions/1740700/get-hex-value-rather-than-rgb-value-using-$
*/
// eslint-disable-next-line class-methods-use-this
;
_proto.rgb2hex = function rgb2hex(rgb) {
var hex = function hex(x) {
return ("0" + parseInt(x, 10).toString(16)).slice(-2);
};
var matches = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
return "#" + hex(matches[1]) + hex(matches[2]) + hex(matches[3]);
};
_createClass(JoomlaFieldSimpleColor, [{
key: "textSelect",
get: function get() {
return this.getAttribute('text-select');
}
}, {
key: "textColor",
get: function get() {
return this.getAttribute('text-color');
}
}, {
key: "textClose",
get: function get() {
return this.getAttribute('text-close');
}
}, {
key: "textTransp",
get: function get() {
return this.getAttribute('text-transparent');
}
}], [{
key: "observedAttributes",
get: function get() {
return ['text-select', 'text-color', 'text-close', 'text-transparent'];
}
}]);
return JoomlaFieldSimpleColor;
}( /*#__PURE__*/_wrapNativeSuper(HTMLElement));
customElements.define('joomla-field-simple-color', JoomlaFieldSimpleColor);
})(customElements);
})();