diff --git a/src/editor/components/seColorGraduatePicker.js b/src/editor/components/seColorGraduatePicker.js index 74b2b0e5..4b23b524 100644 --- a/src/editor/components/seColorGraduatePicker.js +++ b/src/editor/components/seColorGraduatePicker.js @@ -164,6 +164,19 @@ template.innerHTML = ` `; +/** +* @external Math +*/ +/** +* @memberof external:Math +* @param {Float} value +* @param {Float} precision +* @returns {Float} +*/ +function toFixedNumeric (value, precision) { + if (precision === undefined) precision = 0; + return Math.round(value * (10 ** precision)) / (10 ** precision); +} /** * Whether a value is `null` or `undefined`. * @param {any} val @@ -512,7 +525,7 @@ class ColorValuePicker { */ constructor (picker, color, bindedHex, alphaPrecision) { const that = this; // private properties and methods - const inputs = picker.find('td.Text input'); + const inputs = picker.querySelectorAll('td.Text input'); // input box key down - use arrows to alter color /** * @@ -746,9 +759,44 @@ class ColorValuePicker { * @returns {void} */ function destroy () { - red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).unbind('keyup', keyUp).unbind('blur', blur); - red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).unbind('keydown', keyDown); - color.unbind(colorChanged); + red.removeEventListener('keyup', keyUp); + green.removeEventListener('keyup', keyUp); + blue.removeEventListener('keyup', keyUp); + hue.removeEventListener('keyup', keyUp); + saturation.removeEventListener('keyup', keyUp); + value.removeEventListener('keyup', keyUp); + hex.removeEventListener('keyup', keyUp); + + red.removeEventListener('blur', blur); + green.removeEventListener('blur', blur); + blue.removeEventListener('blur', blur); + hue.removeEventListener('blur', blur); + saturation.removeEventListener('blur', blur); + value.removeEventListener('blur', blur); + hex.removeEventListener('blur', blur); + + red.removeEventListener('keydown', keyDown); + green.removeEventListener('keydown', keyDown); + blue.removeEventListener('keydown', keyDown); + hue.removeEventListener('keydown', keyDown); + saturation.removeEventListener('keydown', keyDown); + value.removeEventListener('keydown', keyDown); + + if (alpha !== null) { + alpha.removeEventListener('keyup', keyUp); + alpha.removeEventListener('blur', blur); + alpha.removeEventListener('keydown', keyDown); + } + if (ahex !== null) { + ahex.removeEventListener('keyup', keyUp); + ahex.removeEventListener('blur', blur); + } + if (bindedHex !== null) { + bindedHex.removeEventListener('keyup', keyUp); + bindedHex.removeEventListener('blur', blur); + } + // TODO: color unbind + // color.unbind(colorChanged); red = null; green = null; blue = null; @@ -760,22 +808,57 @@ class ColorValuePicker { ahex = null; } let - red = inputs.eq(3), - green = inputs.eq(4), - blue = inputs.eq(5), - alpha = inputs.length > 7 ? inputs.eq(6) : null, - hue = inputs.eq(0), - saturation = inputs.eq(1), - value = inputs.eq(2), - hex = inputs.eq(inputs.length > 7 ? 7 : 6), - ahex = inputs.length > 7 ? inputs.eq(8) : null; + red = inputs[3], + green = inputs[4], + blue = inputs[5], + alpha = inputs.length > 7 ? inputs[6] : null, + hue = inputs[0], + saturation = inputs[1], + value = inputs[2], + hex = inputs[inputs.length > 7 ? 7 : 6], + ahex = inputs.length > 7 ? inputs[8] : null; $.extend(true, that, { // public properties and methods destroy }); - red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).bind('keyup', keyUp).bind('blur', blur); - red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).bind('keydown', keyDown); - color.bind(colorChanged); + red.addEventListener('keyup', keyUp); + green.addEventListener('keyup', keyUp); + blue.addEventListener('keyup', keyUp); + hue.addEventListener('keyup', keyUp); + saturation.addEventListener('keyup', keyUp); + value.addEventListener('keyup', keyUp); + hex.addEventListener('keyup', keyUp); + + red.addEventListener('blur', blur); + green.addEventListener('blur', blur); + blue.addEventListener('blur', blur); + hue.addEventListener('blur', blur); + saturation.addEventListener('blur', blur); + value.addEventListener('blur', blur); + hex.addEventListener('blur', blur); + + red.addEventListener('keydown', keyDown); + green.addEventListener('keydown', keyDown); + blue.addEventListener('keydown', keyDown); + hue.addEventListener('keydown', keyDown); + saturation.addEventListener('keydown', keyDown); + value.addEventListener('keydown', keyDown); + + if (alpha !== null) { + alpha.addEventListener('keyup', keyUp); + alpha.addEventListener('blur', blur); + alpha.addEventListener('keydown', keyDown); + } + if (ahex !== null) { + ahex.addEventListener('keyup', keyUp); + ahex.addEventListener('blur', blur); + } + if (bindedHex !== null) { + bindedHex.addEventListener('keyup', keyUp); + bindedHex.addEventListener('blur', blur); + } + // TODO: color + // color.bind(colorChanged); } } @@ -1312,80 +1395,7 @@ export class SeColorPicker extends HTMLElement { color: { mode: 'h', active: '', // new Color({ahex: '#ffcc00ff'}), - quickList: [ - /* new Color({h: 360, s: 33, v: 100}), - new Color({h: 360, s: 66, v: 100}), - new Color({h: 360, s: 100, v: 100}), - new Color({h: 360, s: 100, v: 75}), - new Color({h: 360, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 100}), - new Color({h: 30, s: 33, v: 100}), - new Color({h: 30, s: 66, v: 100}), - new Color({h: 30, s: 100, v: 100}), - new Color({h: 30, s: 100, v: 75}), - new Color({h: 30, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 90}), - new Color({h: 60, s: 33, v: 100}), - new Color({h: 60, s: 66, v: 100}), - new Color({h: 60, s: 100, v: 100}), - new Color({h: 60, s: 100, v: 75}), - new Color({h: 60, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 80}), - new Color({h: 90, s: 33, v: 100}), - new Color({h: 90, s: 66, v: 100}), - new Color({h: 90, s: 100, v: 100}), - new Color({h: 90, s: 100, v: 75}), - new Color({h: 90, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 70}), - new Color({h: 120, s: 33, v: 100}), - new Color({h: 120, s: 66, v: 100}), - new Color({h: 120, s: 100, v: 100}), - new Color({h: 120, s: 100, v: 75}), - new Color({h: 120, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 60}), - new Color({h: 150, s: 33, v: 100}), - new Color({h: 150, s: 66, v: 100}), - new Color({h: 150, s: 100, v: 100}), - new Color({h: 150, s: 100, v: 75}), - new Color({h: 150, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 50}), - new Color({h: 180, s: 33, v: 100}), - new Color({h: 180, s: 66, v: 100}), - new Color({h: 180, s: 100, v: 100}), - new Color({h: 180, s: 100, v: 75}), - new Color({h: 180, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 40}), - new Color({h: 210, s: 33, v: 100}), - new Color({h: 210, s: 66, v: 100}), - new Color({h: 210, s: 100, v: 100}), - new Color({h: 210, s: 100, v: 75}), - new Color({h: 210, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 30}), - new Color({h: 240, s: 33, v: 100}), - new Color({h: 240, s: 66, v: 100}), - new Color({h: 240, s: 100, v: 100}), - new Color({h: 240, s: 100, v: 75}), - new Color({h: 240, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 20}), - new Color({h: 270, s: 33, v: 100}), - new Color({h: 270, s: 66, v: 100}), - new Color({h: 270, s: 100, v: 100}), - new Color({h: 270, s: 100, v: 75}), - new Color({h: 270, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 10}), - new Color({h: 300, s: 33, v: 100}), - new Color({h: 300, s: 66, v: 100}), - new Color({h: 300, s: 100, v: 100}), - new Color({h: 300, s: 100, v: 75}), - new Color({h: 300, s: 100, v: 50}), - new Color({h: 180, s: 0, v: 0}), - new Color({h: 330, s: 33, v: 100}), - new Color({h: 330, s: 66, v: 100}), - new Color({h: 330, s: 100, v: 100}), - new Color({h: 330, s: 100, v: 75}), - new Color({h: 330, s: 100, v: 50}), - new Color() */ - ] + quickList: [] }, images: { clientPath: './components/jgraduate/images/', @@ -1467,10 +1477,85 @@ export class SeColorPicker extends HTMLElement { } }; const isLessThanIE7 = Number.parseFloat(navigator.appVersion.split('MSIE')[1]) < 7 && document.body.filters; - const settings = this.jPicker.default; - const win = settings.window; const {Color, ColorMethods} = this.jPicker; + this.jPicker.default.color.active = new Color({ahex: '#ffcc00ff'}); + this.jPicker.default.color.quickList = [ + new Color({h: 360, s: 33, v: 100}), + new Color({h: 360, s: 66, v: 100}), + new Color({h: 360, s: 100, v: 100}), + new Color({h: 360, s: 100, v: 75}), + new Color({h: 360, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 100}), + new Color({h: 30, s: 33, v: 100}), + new Color({h: 30, s: 66, v: 100}), + new Color({h: 30, s: 100, v: 100}), + new Color({h: 30, s: 100, v: 75}), + new Color({h: 30, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 90}), + new Color({h: 60, s: 33, v: 100}), + new Color({h: 60, s: 66, v: 100}), + new Color({h: 60, s: 100, v: 100}), + new Color({h: 60, s: 100, v: 75}), + new Color({h: 60, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 80}), + new Color({h: 90, s: 33, v: 100}), + new Color({h: 90, s: 66, v: 100}), + new Color({h: 90, s: 100, v: 100}), + new Color({h: 90, s: 100, v: 75}), + new Color({h: 90, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 70}), + new Color({h: 120, s: 33, v: 100}), + new Color({h: 120, s: 66, v: 100}), + new Color({h: 120, s: 100, v: 100}), + new Color({h: 120, s: 100, v: 75}), + new Color({h: 120, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 60}), + new Color({h: 150, s: 33, v: 100}), + new Color({h: 150, s: 66, v: 100}), + new Color({h: 150, s: 100, v: 100}), + new Color({h: 150, s: 100, v: 75}), + new Color({h: 150, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 50}), + new Color({h: 180, s: 33, v: 100}), + new Color({h: 180, s: 66, v: 100}), + new Color({h: 180, s: 100, v: 100}), + new Color({h: 180, s: 100, v: 75}), + new Color({h: 180, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 40}), + new Color({h: 210, s: 33, v: 100}), + new Color({h: 210, s: 66, v: 100}), + new Color({h: 210, s: 100, v: 100}), + new Color({h: 210, s: 100, v: 75}), + new Color({h: 210, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 30}), + new Color({h: 240, s: 33, v: 100}), + new Color({h: 240, s: 66, v: 100}), + new Color({h: 240, s: 100, v: 100}), + new Color({h: 240, s: 100, v: 75}), + new Color({h: 240, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 20}), + new Color({h: 270, s: 33, v: 100}), + new Color({h: 270, s: 66, v: 100}), + new Color({h: 270, s: 100, v: 100}), + new Color({h: 270, s: 100, v: 75}), + new Color({h: 270, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 10}), + new Color({h: 300, s: 33, v: 100}), + new Color({h: 300, s: 66, v: 100}), + new Color({h: 300, s: 100, v: 100}), + new Color({h: 300, s: 100, v: 75}), + new Color({h: 300, s: 100, v: 50}), + new Color({h: 180, s: 0, v: 0}), + new Color({h: 330, s: 33, v: 100}), + new Color({h: 330, s: 66, v: 100}), + new Color({h: 330, s: 100, v: 100}), + new Color({h: 330, s: 100, v: 75}), + new Color({h: 330, s: 100, v: 50}), + new Color() + ]; + const settings = this.jPicker.default; const {images, localization, color} = settings; // local copies for YUI compressor + const win = settings.window; const colorObj = { active: (typeof settings.color.active).toString().toLowerCase() === 'string' ? new Color({ahex: !win.alphaSupport && settings.color.active @@ -1503,21 +1588,176 @@ export class SeColorPicker extends HTMLElement { if (typeof cancelCallback !== 'function') { cancelCallback = null; } */ - /** - * @external Math - */ - /** - * @memberof external:Math - * @param {Float} value - * @param {Float} precision - * @returns {Float} - */ - function toFixedNumeric (value, precision) { - if (precision === undefined) precision = 0; - return Math.round(value * (10 ** precision)) / (10 ** precision); + * + * @param {"h"|"s"|"v"|"r"|"g"|"b"|"a"} colorMode + * @throws {Error} Invalid mode + * @returns {void} + */ + function setColorMode (colorMode) { + const {active} = color, // local copies for YUI compressor + // {clientPath} = images, + hex = active.val('hex'); + let rgbMap, rgbBar; + settings.color.mode = colorMode; + switch (colorMode) { + case 'h': + setTimeout(function () { + setBG.call(that, colorMapDiv, 'transparent'); + setImgLoc.call(that, colorMapL1, 0); + setAlpha.call(that, colorMapL1, 100); + setImgLoc.call(that, colorMapL2, 260); + setAlpha.call(that, colorMapL2, 100); + setBG.call(that, colorBarDiv, 'transparent'); + setImgLoc.call(that, colorBarL1, 0); + setAlpha.call(that, colorBarL1, 100); + setImgLoc.call(that, colorBarL2, 260); + setAlpha.call(that, colorBarL2, 100); + setImgLoc.call(that, colorBarL3, 260); + setAlpha.call(that, colorBarL3, 100); + setImgLoc.call(that, colorBarL4, 260); + setAlpha.call(that, colorBarL4, 100); + setImgLoc.call(that, colorBarL6, 260); + setAlpha.call(that, colorBarL6, 100); + }, 0); + colorMap.range('all', {minX: 0, maxX: 100, minY: 0, maxY: 100}); + colorBar.range('rangeY', {minY: 0, maxY: 360}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('s'), y: 100 - active.val('v')}, colorMap); + colorBar.val('y', 360 - active.val('h'), colorBar); + break; + case 's': + setTimeout(function () { + setBG.call(that, colorMapDiv, 'transparent'); + setImgLoc.call(that, colorMapL1, -260); + setImgLoc.call(that, colorMapL2, -520); + setImgLoc.call(that, colorBarL1, -260); + setImgLoc.call(that, colorBarL2, -520); + setImgLoc.call(that, colorBarL6, 260); + setAlpha.call(that, colorBarL6, 100); + }, 0); + colorMap.range('all', {minX: 0, maxX: 360, minY: 0, maxY: 100}); + colorBar.range('rangeY', {minY: 0, maxY: 100}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('h'), y: 100 - active.val('v')}, colorMap); + colorBar.val('y', 100 - active.val('s'), colorBar); + break; + case 'v': + setTimeout(function () { + setBG.call(that, colorMapDiv, '000000'); + setImgLoc.call(that, colorMapL1, -780); + setImgLoc.call(that, colorMapL2, 260); + setBG.call(that, colorBarDiv, hex); + setImgLoc.call(that, colorBarL1, -520); + setImgLoc.call(that, colorBarL2, 260); + setAlpha.call(that, colorBarL2, 100); + setImgLoc.call(that, colorBarL6, 260); + setAlpha.call(that, colorBarL6, 100); + }, 0); + colorMap.range('all', {minX: 0, maxX: 360, minY: 0, maxY: 100}); + colorBar.range('rangeY', {minY: 0, maxY: 100}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('h'), y: 100 - active.val('s')}, colorMap); + colorBar.val('y', 100 - active.val('v'), colorBar); + break; + case 'r': + rgbMap = -1040; + rgbBar = -780; + colorMap.range('all', {minX: 0, maxX: 255, minY: 0, maxY: 255}); + colorBar.range('rangeY', {minY: 0, maxY: 255}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('b'), y: 255 - active.val('g')}, colorMap); + colorBar.val('y', 255 - active.val('r'), colorBar); + break; + case 'g': + rgbMap = -1560; + rgbBar = -1820; + colorMap.range('all', {minX: 0, maxX: 255, minY: 0, maxY: 255}); + colorBar.range('rangeY', {minY: 0, maxY: 255}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('b'), y: 255 - active.val('r')}, colorMap); + colorBar.val('y', 255 - active.val('g'), colorBar); + break; + case 'b': + rgbMap = -2080; + rgbBar = -2860; + colorMap.range('all', {minX: 0, maxX: 255, minY: 0, maxY: 255}); + colorBar.range('rangeY', {minY: 0, maxY: 255}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('r'), y: 255 - active.val('g')}, colorMap); + colorBar.val('y', 255 - active.val('b'), colorBar); + break; + case 'a': + setTimeout(function () { + setBG.call(that, colorMapDiv, 'transparent'); + setImgLoc.call(that, colorMapL1, -260); + setImgLoc.call(that, colorMapL2, -520); + setImgLoc.call(that, colorBarL1, 260); + setImgLoc.call(that, colorBarL2, 260); + setAlpha.call(that, colorBarL2, 100); + setImgLoc.call(that, colorBarL6, 0); + setAlpha.call(that, colorBarL6, 100); + }, 0); + colorMap.range('all', {minX: 0, maxX: 360, minY: 0, maxY: 100}); + colorBar.range('rangeY', {minY: 0, maxY: 255}); + if (isNullish(active.val('ahex'))) break; + colorMap.val('xy', {x: active.val('h'), y: 100 - active.val('v')}, colorMap); + colorBar.val('y', 255 - active.val('a'), colorBar); + break; + default: + throw new Error('Invalid Mode'); + } + switch (colorMode) { + case 'h': + break; + case 's': + case 'v': + case 'a': + setTimeout(function () { + setAlpha.call(that, colorMapL1, 100); + setAlpha.call(that, colorBarL1, 100); + setImgLoc.call(that, colorBarL3, 260); + setAlpha.call(that, colorBarL3, 100); + setImgLoc.call(that, colorBarL4, 260); + setAlpha.call(that, colorBarL4, 100); + }, 0); + break; + case 'r': + case 'g': + case 'b': + setTimeout(function () { + setBG.call(that, colorMapDiv, 'transparent'); + setBG.call(that, colorBarDiv, 'transparent'); + setAlpha.call(that, colorBarL1, 100); + setAlpha.call(that, colorMapL1, 100); + setImgLoc.call(that, colorMapL1, rgbMap); + setImgLoc.call(that, colorMapL2, rgbMap - 260); + setImgLoc.call(that, colorBarL1, rgbBar - 780); + setImgLoc.call(that, colorBarL2, rgbBar - 520); + setImgLoc.call(that, colorBarL3, rgbBar); + setImgLoc.call(that, colorBarL4, rgbBar - 260); + setImgLoc.call(that, colorBarL6, 260); + setAlpha.call(that, colorBarL6, 100); + }, 0); + break; + } + if (isNullish(active.val('ahex'))) return; + activeColorChanged.call(that, active); + } + /** + * Update color when user changes text values. + * @param {external:jQuery} ui + * @param {?module:jPicker.Slider} context + * @returns {void} + */ + function activeColorChanged (ui, context) { + if (isNullish(context) || (context !== colorBar && context !== colorMap)) positionMapAndBarArrows.call(that, ui, context); + setTimeout(function () { + updatePreview.call(that, ui); + updateMapVisuals.call(that, ui); + updateBarVisuals.call(that, ui); + }, 0); } - /** * User has dragged the ColorMap pointer. * @param {external:jQuery} ui @@ -1551,6 +1791,150 @@ export class SeColorPicker extends HTMLElement { } } + /** + * @param {external:jQuery} el + * @param {string} [c="transparent"] + * @returns {void} + */ + function setBG (el, c) { + el.css({backgroundColor: (c && c.length === 6 && '#' + c) || 'transparent'}); + } + + /** + * @param {external:jQuery} img + * @param {string} src The image source + * @returns {void} + */ + function setImg (img, src) { + if (isLessThanIE7 && (src.includes('AlphaBar.png') || src.includes('Bars.png') || src.includes('Maps.png'))) { + img.attr('pngSrc', src); + img.css({backgroundImage: 'none', filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')'}); + } else img.css({backgroundImage: 'url(\'' + src + '\')'}); + } + /** + * @param {external:jQuery} img + * @param {Float} y + * @returns {void} + */ + function setImgLoc (img, y) { + img.css({top: y + 'px'}); + } + + /** + * @param {external:jQuery} obj + * @param {Float} alpha + * @returns {void} + */ + function setAlpha (obj, alpha) { + obj.style.visibility = (alpha > 0) ? 'visible' : 'hidden'; + if (alpha > 0 && alpha < 100) { + if (isLessThanIE7) { + const src = obj.getAttribute('pngSrc'); + if (!isNullish(src) && ( + src.includes('AlphaBar.png') || src.includes('Bars.png') || src.includes('Maps.png') + )) { + obj.css({ + filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + + '\', sizingMethod=\'scale\') progid:DXImageTransform.Microsoft.Alpha(opacity=' + alpha + ')' + }); + } else obj.style.opacity = toFixedNumeric(alpha / 100, 4); + } else obj.style.opacity = toFixedNumeric(alpha / 100, 4); + } else if (alpha === 0 || alpha === 100) { + if (isLessThanIE7) { + const src = obj.getAttribute('pngSrc'); + if (!isNullish(src) && ( + src.includes('AlphaBar.png') || src.includes('Bars.png') || src.includes('Maps.png') + )) { + obj.css({ + filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + + '\', sizingMethod=\'scale\')' + }); + } else obj.style.opacity = ''; + } else obj.style.opacity = ''; + } + } + + /** + * Revert color to original color when opened. + * @returns {void} + */ + function revertColor () { + colorObj.active.val('ahex', colorObj.current.val('ahex')); + } + + /** + * + * @returns {void} + */ + function currentClicked () { + revertColor.call(that); + } + + /** + * + * @returns {void} + */ + function cancelClicked () { + revertColor.call(that); + settings.window.expandable && hide.call(that); + typeof cancelCallback === 'function' && cancelCallback.call(that, colorObj.active, cancelButton); + } + /** + * + * @returns {void} + */ + function okClicked () { + commitColor.call(that); + settings.window.expandable && hide.call(that); + typeof commitCallback === 'function' && commitCallback.call(that, colorObj.active, okButton); + } + + /** + * @param {Event} e + * @returns {false} + */ + function quickPickClicked (e) { + e.preventDefault(); + e.stopPropagation(); + const title = e.target.getAttribute('title'); + colorObj.active.val('ahex', title || null, e.target); + return false; + } + + /** + * User has dragged the ColorBar slider. + * @param {external:jQuery} ui + * @param {?module:jPicker.Slider} context + * @returns {void} + */ + function colorBarValueChanged (ui, context) { + const {active} = color; + if (context !== colorBar && isNullish(active.val())) return; + switch (settings.color.mode) { + case 'h': + active.val('h', {h: 360 - ui.val('y')}, context); + break; + case 's': + active.val('s', {s: 100 - ui.val('y')}, context); + break; + case 'v': + active.val('v', {v: 100 - ui.val('y')}, context); + break; + case 'r': + active.val('r', {r: 255 - ui.val('y')}, context); + break; + case 'g': + active.val('g', {g: 255 - ui.val('y')}, context); + break; + case 'b': + active.val('b', {b: 255 - ui.val('y')}, context); + break; + case 'a': + active.val('a', 255 - ui.val('y'), context); + break; + } + } + /** * @param {external:jQuery} img * @param {string} src The image source @@ -1623,16 +2007,16 @@ export class SeColorPicker extends HTMLElement {