From 0e002a107864f948f50a9ca5a15039f0ce37dfdb Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Fri, 17 Mar 2017 20:29:42 +0100 Subject: [PATCH] [ADD][web_editor_background_color] Custom background color picker (#582) * [ADD][web_editor_background_color] Custom background color picker This addon lets the user choose a preferred background color when editing some web content. Works out of the box with `website` and `mass_mailing` addons, although requires none of those. * [FIX] Avoid clicks removing dropdown menu This happened specifically in Chrome as demonstrated in https://github.com/OCA/web/pull/582#issuecomment-287057052. * [FIX] Use strict equality operator. --- web_editor_background_color/README.rst | 82 + web_editor_background_color/__init__.py | 0 web_editor_background_color/__openerp__.py | 24 + web_editor_background_color/i18n/es.po | 23 + web_editor_background_color/i18n/fr.po | 24 + web_editor_background_color/i18n/sl.po | 24 + .../static/description/icon.png | Bin 0 -> 8343 bytes .../description/mass_mailing_editor.png | Bin 0 -> 44063 bytes .../static/src/css/background_color.less | 14 + .../static/src/js/background_color.js | 72 + .../alpha-horizontal.png | Bin 0 -> 557 bytes .../src/lib/bootstrap-colorpicker/alpha.png | Bin 0 -> 488 bytes .../bootstrap-colorpicker.js | 1319 +++++++++++++++++ .../bootstrap-colorpicker/colorpicker.less | 273 ++++ .../bootstrap-colorpicker/hue-horizontal.png | Bin 0 -> 478 bytes .../src/lib/bootstrap-colorpicker/hue.png | Bin 0 -> 504 bytes .../lib/bootstrap-colorpicker/saturation.png | Bin 0 -> 4143 bytes .../static/src/xml/colorpicker.xml | 19 + web_editor_background_color/views/assets.xml | 18 + .../views/snippets.xml | 25 + 20 files changed, 1917 insertions(+) create mode 100644 web_editor_background_color/README.rst create mode 100644 web_editor_background_color/__init__.py create mode 100644 web_editor_background_color/__openerp__.py create mode 100644 web_editor_background_color/i18n/es.po create mode 100644 web_editor_background_color/i18n/fr.po create mode 100644 web_editor_background_color/i18n/sl.po create mode 100644 web_editor_background_color/static/description/icon.png create mode 100644 web_editor_background_color/static/description/mass_mailing_editor.png create mode 100644 web_editor_background_color/static/src/css/background_color.less create mode 100644 web_editor_background_color/static/src/js/background_color.js create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha-horizontal.png create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha.png create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/bootstrap-colorpicker.js create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/colorpicker.less create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/hue-horizontal.png create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/hue.png create mode 100644 web_editor_background_color/static/src/lib/bootstrap-colorpicker/saturation.png create mode 100644 web_editor_background_color/static/src/xml/colorpicker.xml create mode 100644 web_editor_background_color/views/assets.xml create mode 100644 web_editor_background_color/views/snippets.xml diff --git a/web_editor_background_color/README.rst b/web_editor_background_color/README.rst new file mode 100644 index 00000000..3a4d3cfb --- /dev/null +++ b/web_editor_background_color/README.rst @@ -0,0 +1,82 @@ +.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +================================== +Web Editor Background Color Picker +================================== + +This module extends the functionality of the web editor to support +setting a custom background color to any snippet allowing you to customize it. + +.. figure:: /web_editor_background_color/static/description/mass_mailing_editor.png + :alt: Screenshot of color picker in mass mailing editor + +Usage +===== + +To use this module, you need to: + +#. Install any module that makes use of the web editor, such as + ``mass_mailing`` or ``website``. +#. Use that module's facilities to edit some web content. +#. Drag & drop any snippet into the web editor body. +#. Click on *Customize > Color*. +#. Choose: + + * A color from the theme preset. + * A custom color by clicking on the text input and then either: + + * Writing the HTML color code. + * Selecting a color from the color picker. + * Writing "transparent" to remove it. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/162/9.0 + +Known issues / Roadmap +====================== + +* When migrating to v10, adapt this option again to its brand new built-in + colorpicker. +* While you write to the text input, you may notice it disappears for a moment, + but don't worry, you are still writing. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +External libraries +------------------ + +* This addon includes code copied from bootstrap-colorpicker_ + +.. _bootstrap-colorpicker: https://github.com/itsjavi/bootstrap-colorpicker/tree/2.5.1 + +Contributors +------------ + +* Jairo Llopis + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/web_editor_background_color/__init__.py b/web_editor_background_color/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web_editor_background_color/__openerp__.py b/web_editor_background_color/__openerp__.py new file mode 100644 index 00000000..5d993b7b --- /dev/null +++ b/web_editor_background_color/__openerp__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Jairo Llopis +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "Web Editor Background Color Picker", + "summary": "Set any background color for web editor snippets", + "version": "9.0.1.0.0", + "category": "Website", + "website": "https://www.tecnativa.com", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "LGPL-3", + "application": False, + "installable": True, + "images": [ + "static/description/mass_mailing_editor.png", + ], + "depends": [ + "web_editor", + ], + "data": [ + "views/assets.xml", + "views/snippets.xml", + ], +} diff --git a/web_editor_background_color/i18n/es.po b/web_editor_background_color/i18n/es.po new file mode 100644 index 00000000..9d82bffe --- /dev/null +++ b/web_editor_background_color/i18n/es.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_mail_snippet_bg_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-09 16:32+0000\n" +"PO-Revision-Date: 2016-02-09 17:33+0100\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"Language: es\n" +"X-Generator: Poedit 1.8.6\n" + +#. module: website_mail_snippet_bg_color +#: view:website:website_mail.email_designer_snippets +msgid "Pick Background Color" +msgstr "Escoger el color de fondo" diff --git a/web_editor_background_color/i18n/fr.po b/web_editor_background_color/i18n/fr.po new file mode 100644 index 00000000..f7272f61 --- /dev/null +++ b/web_editor_background_color/i18n/fr.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_mail_snippet_bg_color +# +# Translators: +# Christophe CHAUVET , 2016 +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-30 01:07+0000\n" +"PO-Revision-Date: 2016-06-17 14:52+0000\n" +"Last-Translator: Christophe CHAUVET \n" +"Language-Team: French (http://www.transifex.com/oca/OCA-social-8-0/language/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: website_mail_snippet_bg_color +#: view:website:website_mail.email_designer_snippets +msgid "Pick Background Color" +msgstr "Mettre la couleur de fond" diff --git a/web_editor_background_color/i18n/sl.po b/web_editor_background_color/i18n/sl.po new file mode 100644 index 00000000..1bd31b99 --- /dev/null +++ b/web_editor_background_color/i18n/sl.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_mail_snippet_bg_color +# +# Translators: +# Matjaž Mozetič , 2016 +msgid "" +msgstr "" +"Project-Id-Version: social (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-27 01:40+0000\n" +"PO-Revision-Date: 2016-02-27 16:56+0000\n" +"Last-Translator: Matjaž Mozetič \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-social-8-0/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: website_mail_snippet_bg_color +#: view:website:website_mail.email_designer_snippets +msgid "Pick Background Color" +msgstr "Izbira barve ozadja" diff --git a/web_editor_background_color/static/description/icon.png b/web_editor_background_color/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..794e8ef53be2fb28925d9efc2ddb43d377f33605 GIT binary patch literal 8343 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 literal 0 HcmV?d00001 diff --git a/web_editor_background_color/static/description/mass_mailing_editor.png b/web_editor_background_color/static/description/mass_mailing_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..fdedda2f5bd641e0c491b6601e362e15fca38cdb GIT binary patch literal 44063 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 nfAis)Pix}pk=}nt>o2H;-MAv#T%j2N_@| + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +@colorpicker-img-path: "./"; + +.colorpicker { + .bg-custom { + display: inherit; + .colorpicker-visible { + min-width: initial; + padding: 1ex; + } + } +} diff --git a/web_editor_background_color/static/src/js/background_color.js b/web_editor_background_color/static/src/js/background_color.js new file mode 100644 index 00000000..f7d1687b --- /dev/null +++ b/web_editor_background_color/static/src/js/background_color.js @@ -0,0 +1,72 @@ +/* Copyright 2016-2017 Jairo Llopis + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +odoo.define("web_editor_background_color.colorpicker", function (require) { + "use strict"; + var ajax = require("web.ajax"); + var core = require("web.core"); + var options = require("web_editor.snippets.options"); + + var ready = ajax.loadXML( + "/web_editor_background_color/static/src/xml/colorpicker.xml", + core.qweb + ); + + options.registry.colorpicker.include({ + bind_events: function () { + this._super(); + // Remove inline background-color for normal class-based buttons + this.$el.find(".colorpicker button").on( + "click", + $.proxy(this.remove_inline_background_color, this) + ); + // Enable custom color picker + this.$custom = this.$el.find(".bg-custom"); + this.$custom.colorpicker({ + color: this.$target.css("background-color"), + container: true, + }); + this.$custom.on( + "changeColor", + $.proxy(this.set_inline_background_color, this) + ); + this.$custom.on("click", $.proxy(this.custom_click, this)); + this.$custom.on( + "click", + "input", + $.proxy(this.input_select, this) + ); + // Activate border color changes if it matches background's + var style = this.$target.prop("style"); + this.change_border = + style["border-color"] && + style["background-color"] === style["border-color"]; + }, + custom_click: function (event) { + // HACK Avoid dropdown disappearing when picking colors + event.stopPropagation(); + }, + input_select: function (event) { + $(event.target).focus().select(); + this.$custom.colorpicker("show"); + }, + remove_inline_background_color: function (event) { + this.$target.css("background-color", ""); + if (this.change_border) { + this.$target.css("border-color", ""); + } + }, + set_inline_background_color: function (event) { + var color = String(event.color); + this.$target.css("background-color", color); + if (this.change_border) { + this.$target.css("border-color", color); + } + }, + }); + + return { + ready: ready, + colorpicker: options.registry.colorpicker, + }; +}); diff --git a/web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha-horizontal.png b/web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..f83188951a8e4fab4ba847c8c89f3105354a9816 GIT binary patch literal 557 zcmV+|0@D47P)Nkl5JbD$mJ%t8>^MX+pA8q_5}cAta0DO|R@{IU5|M(GxNxgy+GBd8l;w&2Ec?5< zVo(HvFZxdJAnNTau8ZPXtKOAPtn2rp+IrX0nbY#4bkaNYzIIZLJrooctxYd|?rp8? z)cO+ap+cSA7pbEAUi(YitNzQ6mD^}>0x7Ez^ll73R_Xc-*~Q+Zpz#R`Ko|>@qj2QF zAcKncK;vstA0eL^`!E>xIk#_;8u-NduvaQXn$g$>7z4ttYmjqc8pS->gW&WGdI5U9QmYbj;6~_suM0VjVBk)9?FjGKLNzR9mK$u}% zJ?3)?fRmicTx%xVMC69^f7R;rWA8uZm)yve{K1EP8^1~E?L`XT8&R{cit@G7SGmNI zD-;bNVa)Z2Mil~Fb~9WBo8Kj@u3_#HiLFA<1-{qWmO2-=?0YdKVz6%S z2*9Wz8-&7K@4=W?VKkD82M*@cB4wmZ=tias{62*I43WQYJZEcwS<&N#Nal+GF`i11 zY=e+9d7#-KG!R}kc+3AQ$^6t@932p}V@@!QyyuhBvt_KD{nGq0=-+8wbOe^=^onsM vr1hwgCt@ro;xv+DFr+*}$b1+=kSNMOdLipIvOQ8u00000NkvXXu0mjf9#jU9 literal 0 HcmV?d00001 diff --git a/web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha.png b/web_editor_background_color/static/src/lib/bootstrap-colorpicker/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..2e53a30e73175009326fc030f00862d682ddfc45 GIT binary patch literal 488 zcmVP)B00056Nkl} zZ#=A8HwTy*Ji~Hui*DN)Xc=D2SbWU)JF^vFq?ipSE1)dQB?%2~zL;*2(|O#(oBR;O z#J!!4+zDc0I&77>T+tDIE@oI;6%kXWiptfQV#*c>2foJxnWs^#66pqri5SJi0v*Xc z_vjIT9?6}|hzFF05)=1g9#80;7y9mior*2jP95+vQ|{sWGtx)s=39zr^u6;HX^F`p zkx2{{y^wicti6Khm3Wyed%Eg2H=fbPc7D3VBcDWdj{r#qvrgUX$)#2lTEc%5bs}9E zZ`+UiVVyX}VI5jr+$k@C{pP8ABQF)*q|@k8ll1fgWY+Q?y|Zg0V9OmodqfH%3xo%V zF_0b~gfCME=jtfJ($v-Y^!<}BBQx2`+78RhRbxt$n5&{MunD^|({9#^#Hp{!+@o)R z!Ci&=u08T*r)OJ-Py8D;`eSXCiKA=ket6eR*LHXng}b_5r%ttFu8MwPi~vTbhPJwk eS?^O73H$>F-M_zn@}r;t0000 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: isNaN(H) ? 0 : H, + s: isNaN(S) ? 0 : S, + l: isNaN(L) ? 0 : L, + a: isNaN(a) ? 0 : a + }; + }, + toAlias: function(r, g, b, a) { + var c, rgb = (arguments.length === 0) ? this.toHex() : this.toHex(r, g, b, a); + + // support predef. colors in non-hex format too, as defined in the alias itself + var original = this.origFormat === 'alias' ? rgb : this.toString(this.origFormat, false); + + for (var alias in this.colors) { + c = this.colors[alias].toLowerCase().trim(); + if ((c === rgb) || (c === original)) { + return alias; + } + } + return false; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + /** + * @param {String} strVal + * @returns {Object} Object containing h,s,b,a,format properties or FALSE if failed to parse + */ + parse: function(strVal) { + if (arguments.length === 0) { + return false; + } + + var that = this, + result = false, + isAlias = (typeof this.colors[strVal] !== 'undefined'), + values, format; + + if (isAlias) { + strVal = this.colors[strVal].toLowerCase().trim(); + } + + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal); + values = match && parser.parse.apply(that, [match]); + if (values) { + result = {}; + format = (isAlias ? 'alias' : (parser.format ? parser.format : that.getValidFallbackFormat())); + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + if (result instanceof Object) { + result.format = format; + } + return false; // stop iterating + } + return true; + }); + return result; + }, + getValidFallbackFormat: function() { + var formats = [ + 'rgba', 'rgb', 'hex', 'hsla', 'hsl' + ]; + if (this.origFormat && (formats.indexOf(this.origFormat) !== -1)) { + return this.origFormat; + } + if (this.fallbackFormat && (formats.indexOf(this.fallbackFormat) !== -1)) { + return this.fallbackFormat; + } + + return 'rgba'; // By default, return a format that will not lose the alpha info + }, + /** + * + * @param {string} [format] (default: rgba) + * @param {boolean} [translateAlias] Return real color for pre-defined (non-standard) aliases (default: false) + * @returns {String} + */ + toString: function(format, translateAlias) { + format = format || this.origFormat || this.fallbackFormat; + translateAlias = translateAlias || false; + + var c = false; + + switch (format) { + case 'rgb': + { + c = this.toRGB(); + if (this.rgbaIsTransparent(c)) { + return 'transparent'; + } + return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')'; + } + break; + case 'rgba': + { + c = this.toRGB(); + return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'; + } + break; + case 'hsl': + { + c = this.toHSL(); + return 'hsl(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%)'; + } + break; + case 'hsla': + { + c = this.toHSL(); + return 'hsla(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%,' + c.a + ')'; + } + break; + case 'hex': + { + return this.toHex(); + } + break; + case 'alias': + { + c = this.toAlias(); + + if (c === false) { + return this.toString(this.getValidFallbackFormat()); + } + + if (translateAlias && !(c in Color.webColors) && (c in this.predefinedColors)) { + return this.predefinedColors[c]; + } + + return c; + } + default: + { + return c; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }], + colorNameToHex: function(name) { + if (typeof this.colors[name.toLowerCase()] !== 'undefined') { + return this.colors[name.toLowerCase()]; + } + return false; + } + }; + + /* + * Default plugin options + */ + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + fallbackColor: false, // fallback color value. null = keeps current color. + fallbackFormat: 'hex', // fallback color format + hexNumberSignPrefix: true, // put a '#' (number sign) before hex strings + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '