diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..e567bc73
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,11 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index bfb73d94..f08ef518 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,10 +4,9 @@
ehthumbs.db
Thumbs.db
*.log
-/ignore*
/node_modules/
/bower_components/
/nbproject/
static_server.js
*.php
-.idea
\ No newline at end of file
+.idea
diff --git a/.jshintrc b/.jshintrc
index 2169b9c0..dfbc06b6 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,5 +1,5 @@
{
- "bitwise": true,
+ "bitwise": false,
"browser": true,
"curly": true,
"eqeqeq": true,
@@ -11,8 +11,8 @@
"newcap": true,
"noarg": true,
"node": true,
- "strict": false,
+ "strict": true,
"trailing": true,
"undef": true,
- "predef" : ["Modernizr"]
+ "predef" : ["define"]
}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 9f1ff908..f374f9a2 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,8 +1,20 @@
-## Submitting issues
-For feature requests, suggestions or ideas, add `[SUGGESTION]` before the title of the issue, for anything else follow the following guidelines.
+# Contributing
-### Guidelines
-- Try to reproduce your problem in a separated environment, like in JSFiddle, [here is a template for it](http://jsfiddle.net/mjolnic/0vopxm13/), that you can fork in the same page. It already includes the required JS and CSS files.
+## Support
+
+The issue tracker is not the place for support requests. If you get stuck with bootstrap-colorpicker, it's very likely
+that the fine folks at [StackOverflow](http://stackoverflow.com/) will be able to help you; simply describe the problem
+you're having and provide them a link to the repo (so they know what code you're using).
+
+
+## Issues
+For feature requests, suggestions or ideas, add `[SUGGESTION]` before the title of the issue, for anything else follow
+the following guidelines.
+
+### Steps to submit an issue
+- Try to reproduce your problem in a separated environment, like in JSFiddle,
+ [here is a template for it](http://jsfiddle.net/mjolnic/0vopxm13/), that you can fork in the same page.
+ It already includes the required JS and CSS files.
- Before posting your issue, consider adding this information:
* Expected behaviour: what should happen?
* Actual behaviour: what happens instead?
@@ -10,13 +22,16 @@ For feature requests, suggestions or ideas, add `[SUGGESTION]` before the title
* Plugin version (and/or commit reference).
* jQuery version you use and list of all other plugins/scripts you are using with this one and may cause some conflict.
* A link to your JSFiddle (or similar tool) demo where you reproduced the problem (if applicable).
-
-## Contributing to Source Code
-Thanks for wanting to contribute source code to this project. That's great!
+## Pull Requests
+
+Patches and new features are welcome!
-- Before starting developing the plugin, you need to run `npm install` and `bower install` inside the plugin folder.
+- Fork this project
+- Before start developing, you need to run `npm install` and `bower install` inside the plugin folder.
- Before your commits run always `grunt` inside the plugin folders, to update the dist files (don't modify them manually).
- Do not change the plugin coding style.
- Check that the index.html demos aren't broken (modify if necessary).
-- Test your code at least in Chrome, Firefox and IE >= 10.
+- Test your code at least in Chrome, Firefox and IE >= 10 / Edge.
+- Any new feature should come with updated docs
+- Push to your fork and submit the pull request
diff --git a/Gruntfile.js b/Gruntfile.js
index 597a1c8e..7691d21e 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,129 +1,129 @@
'use strict';
-module.exports = function(grunt) {
+module.exports = function (grunt) {
- grunt.initConfig({
- recess: {
- dist: {
- options: {
- compile: true,
- compress: false
- },
- files: {
- 'dist/css/bootstrap-colorpicker.css': [
- 'src/less/colorpicker.less'
- ]
- }
- },
- distMin: {
- options: {
- compile: true,
- compress: true
- },
- files: {
- 'dist/css/bootstrap-colorpicker.min.css': [
- 'src/less/colorpicker.less'
- ]
- }
- }
+ grunt.initConfig({
+ recess: {
+ dist: {
+ options: {
+ compile: true,
+ compress: false
},
- jshint: {
- options: {
- jshintrc: '.jshintrc'
- },
- files: [
- 'Gruntfile.js',
- 'src/js/commits.js',
- 'src/js/docs.js',
- 'dist/js/*.js'
- ]
- },
- jsbeautifier: {
- htmlFiles: ['index.html'],
- srcFiles: ['src/js/*.js'],
- distFiles: ['dist/js/bootstrap-colorpicker.js']
- },
- combine: {
- dist: {
- input: 'src/js/colorpicker.js',
- output: 'dist/js/bootstrap-colorpicker.js',
- tokens: [{
- token: "'{{color}}';",
- file: 'src/js/colorpicker-color.js',
- }]
- }
- },
- uglify: {
- dist: {
- files: {
- 'dist/js/bootstrap-colorpicker.min.js': [
- 'dist/js/bootstrap-colorpicker.js'
- ]
- }
- }
- },
- bake: {
- options: {
- condense: true,
- indent: 4
- },
- dist: {
- files: {
- 'index.html': ['src/docs.html']
- }
- }
- },
- watch: {
- less: {
- files: [
- 'src/less/*.less'
- ],
- tasks: ['recess']
- },
- js: {
- files: [
- 'src/js/*.js'
- ],
- tasks: ['jsbeautifier:srcFiles', 'combine', 'jsbeautifier:distFiles', 'uglify', 'jshint']
- },
- html: {
- files: [
- 'src/*.html'
- ],
- tasks: ['bake', 'jsbeautifier:htmlFiles']
- }
+ files: {
+ 'dist/css/bootstrap-colorpicker.css': [
+ 'src/less/colorpicker.less'
+ ]
+ }
+ },
+ distMin: {
+ options: {
+ compile: true,
+ compress: true
},
- clean: {
- dist: [
- 'index.html',
- 'dist/css',
- 'dist/js/*.js'
- ]
+ files: {
+ 'dist/css/bootstrap-colorpicker.min.css': [
+ 'src/less/colorpicker.less'
+ ]
+ }
+ }
+ },
+ jshint: {
+ options: {
+ jshintrc: '.jshintrc'
+ },
+ files: [
+ 'Gruntfile.js',
+ 'src/js/docs.js',
+ 'dist/js/bootstrap-colorpicker.js'
+ ]
+ },
+ jsbeautifier: {
+ options: {
+ js: {
+ braceStyle: "collapse",
+ breakChainedMethods: false,
+ e4x: false,
+ evalCode: false,
+ indentChar: " ",
+ indentLevel: 0,
+ indentSize: 2,
+ indentWithTabs: false,
+ jslintHappy: false,
+ keepArrayIndentation: false,
+ keepFunctionIndentation: false,
+ maxPreserveNewlines: 10,
+ preserveNewlines: true,
+ spaceBeforeConditional: true,
+ spaceInParen: false,
+ unescapeStrings: false,
+ wrapLineLength: 0,
+ endWithNewline: true
+ }
+ },
+ srcFiles: ['src/js/*.js'],
+ distFiles: ['dist/js/bootstrap-colorpicker.js']
+ },
+ combine: {
+ dist: {
+ input: 'src/js/colorpicker.js',
+ output: 'dist/js/bootstrap-colorpicker.js',
+ tokens: [{
+ token: "'{{color}}';",
+ file: 'src/js/colorpicker-color.js'
+ }]
+ }
+ },
+ uglify: {
+ dist: {
+ files: {
+ 'dist/js/bootstrap-colorpicker.min.js': [
+ 'dist/js/bootstrap-colorpicker.js'
+ ]
}
- });
+ }
+ },
+ watch: {
+ less: {
+ files: [
+ 'src/less/*.less'
+ ],
+ tasks: ['recess']
+ },
+ js: {
+ files: [
+ 'src/js/*.js'
+ ],
+ tasks: ['jsbeautifier:srcFiles', 'combine', 'jsbeautifier:distFiles', 'uglify', 'jshint']
+ }
+ },
+ clean: {
+ dist: [
+ 'dist/css',
+ 'dist/js/*.js'
+ ]
+ }
+ });
- // Load tasks
- grunt.loadNpmTasks('grunt-contrib-clean');
- grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.loadNpmTasks('grunt-contrib-uglify');
- grunt.loadNpmTasks('grunt-contrib-watch');
- grunt.loadNpmTasks('grunt-bake');
- grunt.loadNpmTasks('grunt-recess');
- grunt.loadNpmTasks('grunt-jsbeautifier');
- grunt.loadNpmTasks('grunt-combine');
+ // Load tasks
+ grunt.loadNpmTasks('grunt-contrib-clean');
+ grunt.loadNpmTasks('grunt-recess');
+ grunt.loadNpmTasks('grunt-jsbeautifier');
+ grunt.loadNpmTasks('grunt-combine');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-contrib-jshint');
- // Register tasks
- grunt.registerTask('default', [
- 'clean',
- 'recess',
- 'jsbeautifier:srcFiles',
- 'combine',
- 'jsbeautifier:distFiles',
- 'uglify',
- 'bake',
- 'jsbeautifier:htmlFiles'
- ]);
- grunt.registerTask('dev', [
- 'watch'
- ]);
+ // Register tasks
+ grunt.registerTask('default', [
+ 'clean',
+ 'recess',
+ 'jsbeautifier:srcFiles',
+ 'combine',
+ 'jsbeautifier:distFiles',
+ 'uglify',
+ 'jshint'
+ ]);
+ grunt.registerTask('dev', [
+ 'watch'
+ ]);
-};
\ No newline at end of file
+};
diff --git a/bower.json b/bower.json
index 0045d726..48344932 100644
--- a/bower.json
+++ b/bower.json
@@ -1,19 +1,20 @@
{
- "name": "mjolnic-bootstrap-colorpicker",
- "version": "2.1.2",
- "main": [
- "dist/css/bootstrap-colorpicker.css",
- "dist/js/bootstrap-colorpicker.js"
- ],
- "dependencies": {
- "jquery": "^1.10",
- "bootstrap": ">=2"
- },
- "ignore": [
- "\\.*",
- "/src",
- "index.html",
- "/package.json",
- "/Gruntfile.js"
- ]
+ "name": "mjolnic-bootstrap-colorpicker",
+ "version": "2.2.0",
+ "main": [
+ "dist/css/bootstrap-colorpicker.css",
+ "dist/js/bootstrap-colorpicker.js"
+ ],
+ "dependencies": {
+ "jquery": ">=1.10",
+ "bootstrap": ">=2"
+ },
+ "ignore": [
+ "\\.*",
+ "/src",
+ "/index.html",
+ "/package.json",
+ "/composer.json",
+ "/Gruntfile.js"
+ ]
}
diff --git a/composer.json b/composer.json
index 366b204b..911853bd 100644
--- a/composer.json
+++ b/composer.json
@@ -1,15 +1,13 @@
{
- "name": "mjolnic/bootstrap-colorpicker",
- "description": "A nice and customizable colorpicker plugin for Twitter Bootstrap 2 and 3",
- "license": "Licensed under the Apache License, Version 2.0",
- "authors": [
- {
- "name": "Javier Aguilar",
- "email": "mjolnic@gmail.com"
- }
- ],
- "minimum-stability": "dev",
- "require": {
-
+ "name": "mjolnic/bootstrap-colorpicker",
+ "description": "A nice and customizable colorpicker plugin for Twitter Bootstrap 2 and 3",
+ "license": "Licensed under the Apache License, Version 2.0",
+ "authors": [
+ {
+ "name": "Javier Aguilar",
+ "homepage": "http://www.mjolnic.com/"
}
+ ],
+ "minimum-stability": "dev",
+ "require": {}
}
diff --git a/dist/js/bootstrap-colorpicker.js b/dist/js/bootstrap-colorpicker.js
index 854e174e..c87ee7e8 100644
--- a/dist/js/bootstrap-colorpicker.js
+++ b/dist/js/bootstrap-colorpicker.js
@@ -10,1044 +10,1044 @@
*/
(function(factory) {
- "use strict";
- if (typeof define === 'function' && define.amd) {
- define(['jquery'], factory);
- } else if (window.jQuery && !window.jQuery.fn.colorpicker) {
- factory(window.jQuery);
- }
+ "use strict";
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else if (window.jQuery && !window.jQuery.fn.colorpicker) {
+ factory(window.jQuery);
}
- (function($) {
- 'use strict';
+ }
+ (function($) {
+ 'use strict';
+
+ // Color object
+ var Color = function(val) {
+ this.value = {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ };
+ this.origFormat = null; // original string format
+ if (val) {
+ if (val.toLowerCase !== undefined) {
+ // cast to string
+ val = val + '';
+ this.setColor(val);
+ } else if (val.h !== undefined) {
+ this.value = val;
+ }
+ }
+ };
- // Color object
- var Color = function(val) {
+ Color.prototype = {
+ constructor: Color,
+ // 140 predefined colors from the HTML Colors spec
+ colors: {
+ "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",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#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",
+ "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",
+ "lightgrey": "#d3d3d3",
+ "lightgreen": "#90ee90",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370d8",
+ "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": "#d87093",
+ "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",
+ "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",
+ "transparent": "transparent"
+ },
+ _sanitizeNumber: function(val) {
+ if (typeof val === 'number') {
+ return val;
+ }
+ if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
+ return 1;
+ }
+ if (val.toLowerCase !== undefined) {
+ return parseFloat(val);
+ }
+ return 1;
+ },
+ isTransparent: function(strVal) {
+ if (!strVal) {
+ return false;
+ }
+ strVal = strVal.toLowerCase().trim();
+ return (strVal === 'transparent') || (strVal.match(/#?00000000/)) || (strVal.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/));
+ },
+ rgbaIsTransparent: function(rgba) {
+ return ((rgba.r === 0) && (rgba.g === 0) && (rgba.b === 0) && (rgba.a === 0));
+ },
+ //parse a string to HSB
+ setColor: function(strVal) {
+ strVal = strVal.toLowerCase().trim();
+ if (strVal) {
+ if (this.isTransparent(strVal)) {
this.value = {
- h: 0,
- s: 0,
- b: 0,
- a: 1
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 0
};
- this.origFormat = null; // original string format
- if (val) {
- if (val.toLowerCase !== undefined) {
- // cast to string
- val = val + '';
- this.setColor(val);
- } else if (val.h !== undefined) {
- this.value = val;
- }
+ } else {
+ this.value = this.stringToHSB(strVal) || {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ }; // if parser fails, defaults to black
+ }
+ }
+ },
+ stringToHSB: function(strVal) {
+ strVal = strVal.toLowerCase();
+ var that = this,
+ result = false;
+ $.each(this.stringParsers, function(i, parser) {
+ var match = parser.re.exec(strVal),
+ values = match && parser.parse.apply(that, [match]),
+ format = parser.format || 'rgba';
+ if (values) {
+ if (format.match(/hsla?/)) {
+ result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
+ } else {
+ result = that.RGBtoHSB.apply(that, values);
}
- };
-
- Color.prototype = {
- constructor: Color,
- // 140 predefined colors from the HTML Colors spec
- colors: {
- "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",
- "darkkhaki": "#bdb76b",
- "darkmagenta": "#8b008b",
- "darkolivegreen": "#556b2f",
- "darkorange": "#ff8c00",
- "darkorchid": "#9932cc",
- "darkred": "#8b0000",
- "darksalmon": "#e9967a",
- "darkseagreen": "#8fbc8f",
- "darkslateblue": "#483d8b",
- "darkslategray": "#2f4f4f",
- "darkturquoise": "#00ced1",
- "darkviolet": "#9400d3",
- "deeppink": "#ff1493",
- "deepskyblue": "#00bfff",
- "dimgray": "#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",
- "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",
- "lightgrey": "#d3d3d3",
- "lightgreen": "#90ee90",
- "lightpink": "#ffb6c1",
- "lightsalmon": "#ffa07a",
- "lightseagreen": "#20b2aa",
- "lightskyblue": "#87cefa",
- "lightslategray": "#778899",
- "lightsteelblue": "#b0c4de",
- "lightyellow": "#ffffe0",
- "lime": "#00ff00",
- "limegreen": "#32cd32",
- "linen": "#faf0e6",
- "magenta": "#ff00ff",
- "maroon": "#800000",
- "mediumaquamarine": "#66cdaa",
- "mediumblue": "#0000cd",
- "mediumorchid": "#ba55d3",
- "mediumpurple": "#9370d8",
- "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": "#d87093",
- "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",
- "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",
- "transparent": "transparent"
- },
- _sanitizeNumber: function(val) {
- if (typeof val === 'number') {
- return val;
- }
- if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
- return 1;
- }
- if (val.toLowerCase !== undefined) {
- return parseFloat(val);
- }
- return 1;
- },
- isTransparent: function(strVal) {
- if (!strVal) {
- return false;
- }
- strVal = strVal.toLowerCase().trim();
- return (strVal == 'transparent') || (strVal.match(/#?00000000/)) || (strVal.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/));
- },
- rgbaIsTransparent: function(rgba) {
- return ((rgba.r == 0) && (rgba.g == 0) && (rgba.b == 0) && (rgba.a == 0));
- },
- //parse a string to HSB
- setColor: function(strVal) {
- strVal = strVal.toLowerCase().trim();
- if (strVal) {
- if (this.isTransparent(strVal)) {
- this.value = {
- h: 0,
- s: 0,
- b: 0,
- a: 0
- }
- } else {
- this.value = this.stringToHSB(strVal) || {
- h: 0,
- s: 0,
- b: 0,
- a: 1
- }; // if parser fails, defaults to black
- }
- }
- },
- stringToHSB: function(strVal) {
- strVal = strVal.toLowerCase();
- var that = this,
- result = false;
- $.each(this.stringParsers, function(i, parser) {
- var match = parser.re.exec(strVal),
- values = match && parser.parse.apply(that, [match]),
- format = parser.format || 'rgba';
- if (values) {
- if (format.match(/hsla?/)) {
- result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
- } else {
- result = that.RGBtoHSB.apply(that, values);
- }
- that.origFormat = format;
- return false;
- }
- return true;
- });
- return result;
- },
- setHue: function(h) {
- this.value.h = 1 - h;
- },
- setSaturation: function(s) {
- this.value.s = s;
- },
- setBrightness: function(b) {
- this.value.b = 1 - b;
- },
- setAlpha: function(a) {
- this.value.a = parseInt((1 - a) * 100, 10) / 100;
- },
- toRGB: function(h, s, b, a) {
- if (!h) {
- h = this.value.h;
- s = this.value.s;
- b = this.value.b;
- }
- h *= 360;
- var R, G, B, X, C;
- h = (h % 360) / 60;
- C = b * s;
- X = C * (1 - Math.abs(h % 2 - 1));
- R = G = B = b - C;
-
- h = ~~h;
- R += [C, X, 0, 0, X, C][h];
- G += [X, C, C, X, 0, 0][h];
- B += [0, 0, X, C, C, X][h];
- return {
- r: Math.round(R * 255),
- g: Math.round(G * 255),
- b: Math.round(B * 255),
- a: a || this.value.a
- };
- },
- toHex: function(h, s, b, a) {
- var rgb = this.toRGB(h, s, b, a);
- if (this.rgbaIsTransparent(rgb)) {
- return 'transparent';
- }
- return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
- },
- toHSL: function(h, s, b, a) {
- h = h || this.value.h;
- s = s || this.value.s;
- b = b || this.value.b;
- a = a || this.value.a;
-
- var H = h,
- L = (2 - s) * b,
- S = s * b;
- if (L > 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 rgb = this.toHex(r, g, b, a);
- for (var alias in this.colors) {
- if (this.colors[alias] == rgb) {
- 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);
+ that.origFormat = format;
+ return false;
+ }
+ return true;
+ });
+ return result;
+ },
+ setHue: function(h) {
+ this.value.h = 1 - h;
+ },
+ setSaturation: function(s) {
+ this.value.s = s;
+ },
+ setBrightness: function(b) {
+ this.value.b = 1 - b;
+ },
+ setAlpha: function(a) {
+ this.value.a = parseInt((1 - a) * 100, 10) / 100;
+ },
+ toRGB: function(h, s, b, a) {
+ if (!h) {
+ h = this.value.h;
+ s = this.value.s;
+ b = this.value.b;
+ }
+ h *= 360;
+ var R, G, B, X, C;
+ h = (h % 360) / 60;
+ C = b * s;
+ X = C * (1 - Math.abs(h % 2 - 1));
+ R = G = B = b - C;
- 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)];
- },
- toString: function(format) {
- format = format || 'rgba';
- switch (format) {
- case 'rgb':
- {
- var rgb = this.toRGB();
- if (this.rgbaIsTransparent(rgb)) {
- return 'transparent';
- }
- return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
- }
- break;
- case 'rgba':
- {
- var rgb = this.toRGB();
- return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';
- }
- break;
- case 'hsl':
- {
- var hsl = this.toHSL();
- return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';
- }
- break;
- case 'hsla':
- {
- var hsl = this.toHSL();
- return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';
- }
- break;
- case 'hex':
- {
- return this.toHex();
- }
- break;
- case 'alias':
- return this.toAlias() || this.toHex();
- default:
- {
- return false;
- }
- 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
- ];
- }
- }, {
- //predefined color name
- re: /^([a-z]{3,})$/,
- format: 'alias',
- parse: function(execResult) {
- var hexval = this.colorNameToHex(execResult[0]) || '#000000';
- var match = this.stringParsers[6].re.exec(hexval),
- values = match && this.stringParsers[6].parse.apply(this, [match]);
- return values;
- }
- }],
- colorNameToHex: function(name) {
- if (typeof this.colors[name.toLowerCase()] !== 'undefined') {
- return this.colors[name.toLowerCase()];
- }
- return false;
- }
+ h = ~~h;
+ R += [C, X, 0, 0, X, C][h];
+ G += [X, C, C, X, 0, 0][h];
+ B += [0, 0, X, C, C, X][h];
+ return {
+ r: Math.round(R * 255),
+ g: Math.round(G * 255),
+ b: Math.round(B * 255),
+ a: a || this.value.a
};
+ },
+ toHex: function(h, s, b, a) {
+ var rgb = this.toRGB(h, s, b, a);
+ if (this.rgbaIsTransparent(rgb)) {
+ return 'transparent';
+ }
+ return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
+ },
+ toHSL: function(h, s, b, a) {
+ h = h || this.value.h;
+ s = s || this.value.s;
+ b = b || this.value.b;
+ a = a || this.value.a;
+ var H = h,
+ L = (2 - s) * b,
+ S = s * b;
+ if (L > 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 rgb = this.toHex(r, g, b, a);
+ for (var alias in this.colors) {
+ if (this.colors[alias] === rgb) {
+ return alias;
+ }
+ }
+ return false;
+ },
+ RGBtoHSB: function(r, g, b, a) {
+ r /= 255;
+ g /= 255;
+ b /= 255;
- 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
- 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: '
',
- align: 'right',
- customClass: null
+ 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 Colorpicker = function(element, options) {
- this.element = $(element).addClass('colorpicker-element');
- this.options = $.extend(true, {}, defaults, this.element.data(), options);
- this.component = this.options.component;
- this.component = (this.component !== false) ? this.element.find(this.component) : false;
- if (this.component && (this.component.length === 0)) {
- this.component = false;
- }
- this.container = (this.options.container === true) ? this.element : this.options.container;
- this.container = (this.container !== false) ? $(this.container) : false;
+ var p = 2 * l - q;
- // Is the element an input? Should we search inside for any input?
- this.input = this.element.is('input') ? this.element : (this.options.input ?
- this.element.find(this.options.input) : false);
- if (this.input && (this.input.length === 0)) {
- this.input = false;
- }
- // Set HSB color
- this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
- this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
+ var tr = h + (1 / 3);
+ var tg = h;
+ var tb = h - (1 / 3);
- // Setup picker
- this.picker = $(this.options.template);
- if (this.options.customClass) {
- this.picker.addClass(this.options.customClass);
+ 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)];
+ },
+ toString: function(format) {
+ format = format || 'rgba';
+ var c = false;
+ switch (format) {
+ case 'rgb':
+ {
+ c = this.toRGB();
+ if (this.rgbaIsTransparent(c)) {
+ return 'transparent';
+ }
+ return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')';
}
- if (this.options.inline) {
- this.picker.addClass('colorpicker-inline colorpicker-visible');
- } else {
- this.picker.addClass('colorpicker-hidden');
+ break;
+ case 'rgba':
+ {
+ c = this.toRGB();
+ return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')';
}
- if (this.options.horizontal) {
- this.picker.addClass('colorpicker-horizontal');
+ break;
+ case 'hsl':
+ {
+ c = this.toHSL();
+ return 'hsl(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%)';
}
- if (this.format === 'rgba' || this.format === 'hsla' || this.options.format === false) {
- this.picker.addClass('colorpicker-with-alpha');
+ 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 + ')';
}
- if (this.options.align === 'right') {
- this.picker.addClass('colorpicker-right');
+ break;
+ case 'hex':
+ {
+ return this.toHex();
}
- this.picker.on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.mousedown, this));
- this.picker.appendTo(this.container ? this.container : $('body'));
-
- // Bind events
- if (this.input !== false) {
- this.input.on({
- 'keyup.colorpicker': $.proxy(this.keyup, this)
- });
- if (this.component === false) {
- this.element.on({
- 'focus.colorpicker': $.proxy(this.show, this)
- });
- }
- if (this.options.inline === false) {
- this.element.on({
- 'focusout.colorpicker': $.proxy(this.hide, this)
- });
- }
+ break;
+ case 'alias':
+ return this.toAlias() || this.toHex();
+ 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
+ ];
+ }
+ }, {
+ //predefined color name
+ re: /^([a-z]{3,})$/,
+ format: 'alias',
+ parse: function(execResult) {
+ var hexval = this.colorNameToHex(execResult[0]) || '#000000';
+ var match = this.stringParsers[6].re.exec(hexval),
+ values = match && this.stringParsers[6].parse.apply(this, [match]);
+ return values;
+ }
+ }],
+ colorNameToHex: function(name) {
+ if (typeof this.colors[name.toLowerCase()] !== 'undefined') {
+ return this.colors[name.toLowerCase()];
+ }
+ return false;
+ }
+ };
- if (this.component !== false) {
- this.component.on({
- 'click.colorpicker': $.proxy(this.show, this)
- });
- }
- if ((this.input === false) && (this.component === false)) {
- this.element.on({
- 'click.colorpicker': $.proxy(this.show, this)
- });
- }
+ 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
+ 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: '',
+ align: 'right',
+ customClass: null
+ };
- // for HTML5 input[type='color']
- if ((this.input !== false) && (this.component !== false) && (this.input.attr('type') === 'color')) {
+ var Colorpicker = function(element, options) {
+ this.element = $(element).addClass('colorpicker-element');
+ this.options = $.extend(true, {}, defaults, this.element.data(), options);
+ this.component = this.options.component;
+ this.component = (this.component !== false) ? this.element.find(this.component) : false;
+ if (this.component && (this.component.length === 0)) {
+ this.component = false;
+ }
+ this.container = (this.options.container === true) ? this.element : this.options.container;
+ this.container = (this.container !== false) ? $(this.container) : false;
- this.input.on({
- 'click.colorpicker': $.proxy(this.show, this),
- 'focus.colorpicker': $.proxy(this.show, this)
- });
- }
- this.update();
+ // Is the element an input? Should we search inside for any input?
+ this.input = this.element.is('input') ? this.element : (this.options.input ?
+ this.element.find(this.options.input) : false);
+ if (this.input && (this.input.length === 0)) {
+ this.input = false;
+ }
+ // Set HSB color
+ this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
+ this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
- $($.proxy(function() {
- this.element.trigger('create');
- }, this));
- };
+ // Setup picker
+ this.picker = $(this.options.template);
+ if (this.options.customClass) {
+ this.picker.addClass(this.options.customClass);
+ }
+ if (this.options.inline) {
+ this.picker.addClass('colorpicker-inline colorpicker-visible');
+ } else {
+ this.picker.addClass('colorpicker-hidden');
+ }
+ if (this.options.horizontal) {
+ this.picker.addClass('colorpicker-horizontal');
+ }
+ if (this.format === 'rgba' || this.format === 'hsla' || this.options.format === false) {
+ this.picker.addClass('colorpicker-with-alpha');
+ }
+ if (this.options.align === 'right') {
+ this.picker.addClass('colorpicker-right');
+ }
+ this.picker.on('mousedown.colorpicker touchstart.colorpicker', $.proxy(this.mousedown, this));
+ this.picker.appendTo(this.container ? this.container : $('body'));
- Colorpicker.Color = Color;
+ // Bind events
+ if (this.input !== false) {
+ this.input.on({
+ 'keyup.colorpicker': $.proxy(this.keyup, this)
+ });
+ if (this.component === false) {
+ this.element.on({
+ 'focus.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ if (this.options.inline === false) {
+ this.element.on({
+ 'focusout.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ }
- Colorpicker.prototype = {
- constructor: Colorpicker,
- destroy: function() {
- this.picker.remove();
- this.element.removeData('colorpicker').off('.colorpicker');
- if (this.input !== false) {
- this.input.off('.colorpicker');
- }
- if (this.component !== false) {
- this.component.off('.colorpicker');
- }
- this.element.removeClass('colorpicker-element');
- this.element.trigger({
- type: 'destroy'
- });
- },
- reposition: function() {
- if (this.options.inline !== false || this.options.container) {
- return false;
- }
- var type = this.container && this.container[0] !== document.body ? 'position' : 'offset';
- var element = this.component || this.element;
- var offset = element[type]();
- if (this.options.align === 'right') {
- offset.left -= this.picker.outerWidth() - element.outerWidth()
- }
- this.picker.css({
- top: offset.top + element.outerHeight(),
- left: offset.left
- });
- },
- show: function(e) {
- if (this.isDisabled()) {
- return false;
- }
- this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
- this.reposition();
- $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
- if (e && (!this.hasInput() || this.input.attr('type') === 'color')) {
- if (e.stopPropagation && e.preventDefault) {
- e.stopPropagation();
- e.preventDefault();
- }
- }
- if (this.options.inline === false) {
- $(window.document).on({
- 'mousedown.colorpicker': $.proxy(this.hide, this)
- });
- }
- this.element.trigger({
- type: 'showPicker',
- color: this.color
- });
- },
- hide: function() {
- this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
- $(window).off('resize.colorpicker', this.reposition);
- $(document).off({
- 'mousedown.colorpicker': this.hide
- });
- this.update();
- this.element.trigger({
- type: 'hidePicker',
- color: this.color
- });
- },
- updateData: function(val) {
- val = val || this.color.toString(this.format);
- this.element.data('color', val);
- return val;
- },
- updateInput: function(val) {
- val = val || this.color.toString(this.format);
- if (this.input !== false) {
- this.input.prop('value', val);
- }
- return val;
- },
- updatePicker: function(val) {
- if (val !== undefined) {
- this.color = new Color(val);
- }
- var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
- var icns = this.picker.find('i');
- if (icns.length === 0) {
- return;
- }
- if (this.options.horizontal === false) {
- sl = this.options.sliders;
- icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
- .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
- } else {
- sl = this.options.slidersHorz;
- icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
- .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
- }
- icns.eq(0).css({
- 'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
- 'left': this.color.value.s * sl.saturation.maxLeft
- });
- this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
- this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
- this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
- return val;
- },
- updateComponent: function(val) {
- val = val || this.color.toString(this.format);
- if (this.component !== false) {
- var icn = this.component.find('i').eq(0);
- if (icn.length > 0) {
- icn.css({
- 'backgroundColor': val
- });
- } else {
- this.component.css({
- 'backgroundColor': val
- });
- }
- }
- return val;
- },
- update: function(force) {
- var val;
- if ((this.getValue(false) !== false) || (force === true)) {
- // Update input/data only if the current value is not empty
- val = this.updateComponent();
- this.updateInput(val);
- this.updateData(val);
- this.updatePicker(); // only update picker if value is not empty
- }
- return val;
+ if (this.component !== false) {
+ this.component.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
- },
- setValue: function(val) { // set color manually
- this.color = new Color(val);
- this.update();
- this.element.trigger({
- type: 'changeColor',
- color: this.color,
- value: val
- });
- },
- getValue: function(defaultValue) {
- defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
- var val;
- if (this.hasInput()) {
- val = this.input.val();
- } else {
- val = this.element.data('color');
- }
- if ((val === undefined) || (val === '') || (val === null)) {
- // if not defined or empty, return default
- val = defaultValue;
- }
- return val;
- },
- hasInput: function() {
- return (this.input !== false);
- },
- isDisabled: function() {
- if (this.hasInput()) {
- return (this.input.prop('disabled') === true);
- }
- return false;
- },
- disable: function() {
- if (this.hasInput()) {
- this.input.prop('disabled', true);
- this.element.trigger({
- type: 'disable',
- color: this.color,
- value: this.getValue()
- });
- return true;
- }
- return false;
- },
- enable: function() {
- if (this.hasInput()) {
- this.input.prop('disabled', false);
- this.element.trigger({
- type: 'enable',
- color: this.color,
- value: this.getValue()
- });
- return true;
- }
- return false;
- },
- currentSlider: null,
- mousePointer: {
- left: 0,
- top: 0
- },
- mousedown: function(e) {
- if (!e.pageX && !e.pageY && e.originalEvent) {
- e.pageX = e.originalEvent.touches[0].pageX;
- e.pageY = e.originalEvent.touches[0].pageY;
- }
- e.stopPropagation();
- e.preventDefault();
+ if ((this.input === false) && (this.component === false)) {
+ this.element.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
- var target = $(e.target);
+ // for HTML5 input[type='color']
+ if ((this.input !== false) && (this.component !== false) && (this.input.attr('type') === 'color')) {
- //detect the slider and set the limits and callbacks
- var zone = target.closest('div');
- var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
- if (!zone.is('.colorpicker')) {
- if (zone.is('.colorpicker-saturation')) {
- this.currentSlider = $.extend({}, sl.saturation);
- } else if (zone.is('.colorpicker-hue')) {
- this.currentSlider = $.extend({}, sl.hue);
- } else if (zone.is('.colorpicker-alpha')) {
- this.currentSlider = $.extend({}, sl.alpha);
- } else {
- return false;
- }
- var offset = zone.offset();
- //reference to guide's style
- this.currentSlider.guide = zone.find('i')[0].style;
- this.currentSlider.left = e.pageX - offset.left;
- this.currentSlider.top = e.pageY - offset.top;
- this.mousePointer = {
- left: e.pageX,
- top: e.pageY
- };
- //trigger mousemove to move the guide to the current position
- $(document).on({
- 'mousemove.colorpicker': $.proxy(this.mousemove, this),
- 'touchmove.colorpicker': $.proxy(this.mousemove, this),
- 'mouseup.colorpicker': $.proxy(this.mouseup, this),
- 'touchend.colorpicker': $.proxy(this.mouseup, this)
- }).trigger('mousemove');
- }
- return false;
- },
- mousemove: function(e) {
- if (!e.pageX && !e.pageY && e.originalEvent) {
- e.pageX = e.originalEvent.touches[0].pageX;
- e.pageY = e.originalEvent.touches[0].pageY;
- }
- e.stopPropagation();
- e.preventDefault();
- var left = Math.max(
- 0,
- Math.min(
- this.currentSlider.maxLeft,
- this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
- )
- );
- var top = Math.max(
- 0,
- Math.min(
- this.currentSlider.maxTop,
- this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
- )
- );
- this.currentSlider.guide.left = left + 'px';
- this.currentSlider.guide.top = top + 'px';
- if (this.currentSlider.callLeft) {
- this.color[this.currentSlider.callLeft].call(this.color, left / this.currentSlider.maxLeft);
- }
- if (this.currentSlider.callTop) {
- this.color[this.currentSlider.callTop].call(this.color, top / this.currentSlider.maxTop);
- }
- // Change format dynamically
- // Only occurs if user choose the dynamic format by
- // setting option format to false
- if (this.currentSlider.callTop == 'setAlpha' && this.options.format === false) {
+ this.input.on({
+ 'click.colorpicker': $.proxy(this.show, this),
+ 'focus.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ this.update();
- // Converting from hex / rgb to rgba
- if (this.color.value.a != 1) {
- this.format = 'rgba';
- this.color.origFormat = 'rgba';
- }
+ $($.proxy(function() {
+ this.element.trigger('create');
+ }, this));
+ };
- // Converting from rgba to hex
- else {
- this.format = 'hex';
- this.color.origFormat = 'hex';
- }
- }
- this.update(true);
+ Colorpicker.Color = Color;
- this.element.trigger({
- type: 'changeColor',
- color: this.color
- });
- return false;
- },
- mouseup: function(e) {
- e.stopPropagation();
- e.preventDefault();
- $(document).off({
- 'mousemove.colorpicker': this.mousemove,
- 'touchmove.colorpicker': this.mousemove,
- 'mouseup.colorpicker': this.mouseup,
- 'touchend.colorpicker': this.mouseup
- });
- return false;
- },
- keyup: function(e) {
- if ((e.keyCode === 38)) {
- if (this.color.value.a < 1) {
- this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
- }
- this.update(true);
- } else if ((e.keyCode === 40)) {
- if (this.color.value.a > 0) {
- this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
- }
- this.update(true);
- } else {
- var val = this.input.val();
- this.color = new Color(val);
- // Change format dynamically
- // Only occurs if user choose the dynamic format by
- // setting option format to false
- if (this.color.origFormat && this.options.format === false) {
- this.format = this.color.origFormat;
- }
- if (this.getValue(false) !== false) {
- this.updateData();
- this.updateComponent();
- this.updatePicker();
- }
- }
- this.element.trigger({
- type: 'changeColor',
- color: this.color,
- value: val
- });
- }
- };
+ Colorpicker.prototype = {
+ constructor: Colorpicker,
+ destroy: function() {
+ this.picker.remove();
+ this.element.removeData('colorpicker').off('.colorpicker');
+ if (this.input !== false) {
+ this.input.off('.colorpicker');
+ }
+ if (this.component !== false) {
+ this.component.off('.colorpicker');
+ }
+ this.element.removeClass('colorpicker-element');
+ this.element.trigger({
+ type: 'destroy'
+ });
+ },
+ reposition: function() {
+ if (this.options.inline !== false || this.options.container) {
+ return false;
+ }
+ var type = this.container && this.container[0] !== document.body ? 'position' : 'offset';
+ var element = this.component || this.element;
+ var offset = element[type]();
+ if (this.options.align === 'right') {
+ offset.left -= this.picker.outerWidth() - element.outerWidth();
+ }
+ this.picker.css({
+ top: offset.top + element.outerHeight(),
+ left: offset.left
+ });
+ },
+ show: function(e) {
+ if (this.isDisabled()) {
+ return false;
+ }
+ this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
+ this.reposition();
+ $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
+ if (e && (!this.hasInput() || this.input.attr('type') === 'color')) {
+ if (e.stopPropagation && e.preventDefault) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ }
+ if (this.options.inline === false) {
+ $(window.document).on({
+ 'mousedown.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ this.element.trigger({
+ type: 'showPicker',
+ color: this.color
+ });
+ },
+ hide: function() {
+ this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
+ $(window).off('resize.colorpicker', this.reposition);
+ $(document).off({
+ 'mousedown.colorpicker': this.hide
+ });
+ this.update();
+ this.element.trigger({
+ type: 'hidePicker',
+ color: this.color
+ });
+ },
+ updateData: function(val) {
+ val = val || this.color.toString(this.format);
+ this.element.data('color', val);
+ return val;
+ },
+ updateInput: function(val) {
+ val = val || this.color.toString(this.format);
+ if (this.input !== false) {
+ this.input.prop('value', val);
+ }
+ return val;
+ },
+ updatePicker: function(val) {
+ if (val !== undefined) {
+ this.color = new Color(val);
+ }
+ var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
+ var icns = this.picker.find('i');
+ if (icns.length === 0) {
+ return;
+ }
+ if (this.options.horizontal === false) {
+ sl = this.options.sliders;
+ icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
+ .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
+ } else {
+ sl = this.options.slidersHorz;
+ icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
+ .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
+ }
+ icns.eq(0).css({
+ 'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
+ 'left': this.color.value.s * sl.saturation.maxLeft
+ });
+ this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
+ this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
+ this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
+ return val;
+ },
+ updateComponent: function(val) {
+ val = val || this.color.toString(this.format);
+ if (this.component !== false) {
+ var icn = this.component.find('i').eq(0);
+ if (icn.length > 0) {
+ icn.css({
+ 'backgroundColor': val
+ });
+ } else {
+ this.component.css({
+ 'backgroundColor': val
+ });
+ }
+ }
+ return val;
+ },
+ update: function(force) {
+ var val;
+ if ((this.getValue(false) !== false) || (force === true)) {
+ // Update input/data only if the current value is not empty
+ val = this.updateComponent();
+ this.updateInput(val);
+ this.updateData(val);
+ this.updatePicker(); // only update picker if value is not empty
+ }
+ return val;
- $.colorpicker = Colorpicker;
+ },
+ setValue: function(val) { // set color manually
+ this.color = new Color(val);
+ this.update();
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: val
+ });
+ },
+ getValue: function(defaultValue) {
+ defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
+ var val;
+ if (this.hasInput()) {
+ val = this.input.val();
+ } else {
+ val = this.element.data('color');
+ }
+ if ((val === undefined) || (val === '') || (val === null)) {
+ // if not defined or empty, return default
+ val = defaultValue;
+ }
+ return val;
+ },
+ hasInput: function() {
+ return (this.input !== false);
+ },
+ isDisabled: function() {
+ if (this.hasInput()) {
+ return (this.input.prop('disabled') === true);
+ }
+ return false;
+ },
+ disable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', true);
+ this.element.trigger({
+ type: 'disable',
+ color: this.color,
+ value: this.getValue()
+ });
+ return true;
+ }
+ return false;
+ },
+ enable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', false);
+ this.element.trigger({
+ type: 'enable',
+ color: this.color,
+ value: this.getValue()
+ });
+ return true;
+ }
+ return false;
+ },
+ currentSlider: null,
+ mousePointer: {
+ left: 0,
+ top: 0
+ },
+ mousedown: function(e) {
+ if (!e.pageX && !e.pageY && e.originalEvent) {
+ e.pageX = e.originalEvent.touches[0].pageX;
+ e.pageY = e.originalEvent.touches[0].pageY;
+ }
+ e.stopPropagation();
+ e.preventDefault();
- $.fn.colorpicker = function(option) {
- var pickerArgs = arguments,
- rv;
+ var target = $(e.target);
- var $returnValue = this.each(function() {
- var $this = $(this),
- inst = $this.data('colorpicker'),
- options = ((typeof option === 'object') ? option : {});
- if ((!inst) && (typeof option !== 'string')) {
- $this.data('colorpicker', new Colorpicker(this, options));
- } else {
- if (typeof option === 'string') {
- rv = inst[option].apply(inst, Array.prototype.slice.call(pickerArgs, 1));
- }
- }
- });
- if (option === 'getValue') {
- return rv;
- }
- return $returnValue;
- };
+ //detect the slider and set the limits and callbacks
+ var zone = target.closest('div');
+ var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
+ if (!zone.is('.colorpicker')) {
+ if (zone.is('.colorpicker-saturation')) {
+ this.currentSlider = $.extend({}, sl.saturation);
+ } else if (zone.is('.colorpicker-hue')) {
+ this.currentSlider = $.extend({}, sl.hue);
+ } else if (zone.is('.colorpicker-alpha')) {
+ this.currentSlider = $.extend({}, sl.alpha);
+ } else {
+ return false;
+ }
+ var offset = zone.offset();
+ //reference to guide's style
+ this.currentSlider.guide = zone.find('i')[0].style;
+ this.currentSlider.left = e.pageX - offset.left;
+ this.currentSlider.top = e.pageY - offset.top;
+ this.mousePointer = {
+ left: e.pageX,
+ top: e.pageY
+ };
+ //trigger mousemove to move the guide to the current position
+ $(document).on({
+ 'mousemove.colorpicker': $.proxy(this.mousemove, this),
+ 'touchmove.colorpicker': $.proxy(this.mousemove, this),
+ 'mouseup.colorpicker': $.proxy(this.mouseup, this),
+ 'touchend.colorpicker': $.proxy(this.mouseup, this)
+ }).trigger('mousemove');
+ }
+ return false;
+ },
+ mousemove: function(e) {
+ if (!e.pageX && !e.pageY && e.originalEvent) {
+ e.pageX = e.originalEvent.touches[0].pageX;
+ e.pageY = e.originalEvent.touches[0].pageY;
+ }
+ e.stopPropagation();
+ e.preventDefault();
+ var left = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxLeft,
+ this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
+ )
+ );
+ var top = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxTop,
+ this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
+ )
+ );
+ this.currentSlider.guide.left = left + 'px';
+ this.currentSlider.guide.top = top + 'px';
+ if (this.currentSlider.callLeft) {
+ this.color[this.currentSlider.callLeft].call(this.color, left / this.currentSlider.maxLeft);
+ }
+ if (this.currentSlider.callTop) {
+ this.color[this.currentSlider.callTop].call(this.color, top / this.currentSlider.maxTop);
+ }
+ // Change format dynamically
+ // Only occurs if user choose the dynamic format by
+ // setting option format to false
+ if (this.currentSlider.callTop === 'setAlpha' && this.options.format === false) {
+
+ // Converting from hex / rgb to rgba
+ if (this.color.value.a !== 1) {
+ this.format = 'rgba';
+ this.color.origFormat = 'rgba';
+ }
+
+ // Converting from rgba to hex
+ else {
+ this.format = 'hex';
+ this.color.origFormat = 'hex';
+ }
+ }
+ this.update(true);
+
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color
+ });
+ return false;
+ },
+ mouseup: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ $(document).off({
+ 'mousemove.colorpicker': this.mousemove,
+ 'touchmove.colorpicker': this.mousemove,
+ 'mouseup.colorpicker': this.mouseup,
+ 'touchend.colorpicker': this.mouseup
+ });
+ return false;
+ },
+ keyup: function(e) {
+ if ((e.keyCode === 38)) {
+ if (this.color.value.a < 1) {
+ this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else if ((e.keyCode === 40)) {
+ if (this.color.value.a > 0) {
+ this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else {
+ this.color = new Color(this.input.val());
+ // Change format dynamically
+ // Only occurs if user choose the dynamic format by
+ // setting option format to false
+ if (this.color.origFormat && this.options.format === false) {
+ this.format = this.color.origFormat;
+ }
+ if (this.getValue(false) !== false) {
+ this.updateData();
+ this.updateComponent();
+ this.updatePicker();
+ }
+ }
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: this.input.val()
+ });
+ }
+ };
+
+ $.colorpicker = Colorpicker;
+
+ $.fn.colorpicker = function(option) {
+ var pickerArgs = arguments,
+ rv;
+
+ var $returnValue = this.each(function() {
+ var $this = $(this),
+ inst = $this.data('colorpicker'),
+ options = ((typeof option === 'object') ? option : {});
+ if ((!inst) && (typeof option !== 'string')) {
+ $this.data('colorpicker', new Colorpicker(this, options));
+ } else {
+ if (typeof option === 'string') {
+ rv = inst[option].apply(inst, Array.prototype.slice.call(pickerArgs, 1));
+ }
+ }
+ });
+ if (option === 'getValue') {
+ return rv;
+ }
+ return $returnValue;
+ };
- $.fn.colorpicker.constructor = Colorpicker;
+ $.fn.colorpicker.constructor = Colorpicker;
- }));
+ }));
diff --git a/dist/js/bootstrap-colorpicker.min.js b/dist/js/bootstrap-colorpicker.min.js
index 5f399b06..8866d301 100644
--- a/dist/js/bootstrap-colorpicker.min.js
+++ b/dist/js/bootstrap-colorpicker.min.js
@@ -1 +1 @@
-!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):window.jQuery&&!window.jQuery.fn.colorpicker&&a(window.jQuery)}(function(a){"use strict";var b=function(a){this.value={h:0,s:0,b:0,a:1},this.origFormat=null,a&&(void 0!==a.toLowerCase?(a+="",this.setColor(a)):void 0!==a.h&&(this.value=a))};b.prototype={constructor:b,colors:{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",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#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",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",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",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",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",transparent:"transparent"},_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:void 0!==a.toLowerCase?parseFloat(a):1},isTransparent:function(a){return a?(a=a.toLowerCase().trim(),"transparent"==a||a.match(/#?00000000/)||a.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/)):!1},rgbaIsTransparent:function(a){return 0==a.r&&0==a.g&&0==a.b&&0==a.a},setColor:function(a){a=a.toLowerCase().trim(),a&&(this.value=this.isTransparent(a)?{h:0,s:0,b:0,a:0}:this.stringToHSB(a)||{h:0,s:0,b:0,a:1})},stringToHSB:function(b){b=b.toLowerCase();var c=this,d=!1;return a.each(this.stringParsers,function(a,e){var f=e.re.exec(b),g=f&&e.parse.apply(c,[f]),h=e.format||"rgba";return g?(d=h.match(/hsla?/)?c.RGBtoHSB.apply(c,c.HSLtoRGB.apply(c,g)):c.RGBtoHSB.apply(c,g),c.origFormat=h,!1):!0}),d},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=parseInt(100*(1-a),10)/100},toRGB:function(a,b,c,d){a||(a=this.value.h,b=this.value.s,c=this.value.b),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Math.abs(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],{r:Math.round(255*e),g:Math.round(255*f),b:Math.round(255*g),a:d||this.value.a}},toHex:function(a,b,c,d){var e=this.toRGB(a,b,c,d);return this.rgbaIsTransparent(e)?"transparent":"#"+(1<<24|parseInt(e.r)<<16|parseInt(e.g)<<8|parseInt(e.b)).toString(16).substr(1)},toHSL:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&1>=f?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e=this.toHex(a,b,c,d);for(var f in this.colors)if(this.colors[f]==e)return f;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return 0>c?c+=1:c>1&&(c-=1),1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){0>b&&(b=0);var e;e=.5>=c?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){switch(a=a||"rgba"){case"rgb":var b=this.toRGB();return this.rgbaIsTransparent(b)?"transparent":"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":var b=this.toRGB();return"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":var c=this.toHSL();return"hsl("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%)";case"hsla":var c=this.toHSL();return"hsla("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%,"+c.a+")";case"hex":return this.toHex();case"alias":return this.toAlias()||this.toHex();default:return!1}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[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(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}},{re:/^([a-z]{3,})$/,format:"alias",parse:function(a){var b=this.colorNameToHex(a[0])||"#000000",c=this.stringParsers[6].re.exec(b),d=c&&this.stringParsers[6].parse.apply(this,[c]);return d}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]?this.colors[a.toLowerCase()]:!1}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'',align:"right",customClass:null},d=function(d,e){this.element=a(d).addClass("colorpicker-element"),this.options=a.extend(!0,{},c,this.element.data(),e),this.component=this.options.component,this.component=this.component!==!1?this.element.find(this.component):!1,this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1?a(this.container):!1,this.input=this.element.is("input")?this.element:this.options.input?this.element.find(this.options.input):!1,this.input&&0===this.input.length&&(this.input=!1),this.color=new b(this.options.color!==!1?this.options.color:this.getValue()),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.picker=a(this.options.template),this.options.customClass&&this.picker.addClass(this.options.customClass),this.picker.addClass(this.options.inline?"colorpicker-inline colorpicker-visible":"colorpicker-hidden"),this.options.horizontal&&this.picker.addClass("colorpicker-horizontal"),("rgba"===this.format||"hsla"===this.format||this.options.format===!1)&&this.picker.addClass("colorpicker-with-alpha"),"right"===this.options.align&&this.picker.addClass("colorpicker-right"),this.picker.on("mousedown.colorpicker touchstart.colorpicker",a.proxy(this.mousedown,this)),this.picker.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.input!==!1&&this.component!==!1&&"color"===this.input.attr("type")&&this.input.on({"click.colorpicker":a.proxy(this.show,this),"focus.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1||this.options.container)return!1;var a=this.container&&this.container[0]!==document.body?"position":"offset",b=this.component||this.element,c=b[a]();"right"===this.options.align&&(c.left-=this.picker.outerWidth()-b.outerWidth()),this.picker.css({top:c.top+b.outerHeight(),left:c.left})},show:function(b){return this.isDisabled()?!1:(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!b||this.hasInput()&&"color"!==this.input.attr("type")||b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),this.options.inline===!1&&a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),void this.element.trigger({type:"showPicker",color:this.color}))},hide:function(){this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(document).off({"mousedown.colorpicker":this.hide}),this.update(),this.element.trigger({type:"hidePicker",color:this.color})},updateData:function(a){return a=a||this.color.toString(this.format),this.element.data("color",a),a},updateInput:function(a){return a=a||this.color.toString(this.format),this.input!==!1&&this.input.prop("value",a),a},updatePicker:function(a){void 0!==a&&(this.color=new b(a));var c=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,d=this.picker.find("i");return 0!==d.length?(this.options.horizontal===!1?(c=this.options.sliders,d.eq(1).css("top",c.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",c.alpha.maxTop*(1-this.color.value.a))):(c=this.options.slidersHorz,d.eq(1).css("left",c.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",c.alpha.maxLeft*(1-this.color.value.a))),d.eq(0).css({top:c.saturation.maxTop-this.color.value.b*c.saturation.maxTop,left:this.color.value.s*c.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format)),a):void 0},updateComponent:function(a){if(a=a||this.color.toString(this.format),this.component!==!1){var b=this.component.find("i").eq(0);b.length>0?b.css({backgroundColor:a}):this.component.css({backgroundColor:a})}return a},update:function(a){var b;return(this.getValue(!1)!==!1||a===!0)&&(b=this.updateComponent(),this.updateInput(b),this.updateData(b),this.updatePicker()),b},setValue:function(a){this.color=new b(a),this.update(),this.element.trigger({type:"changeColor",color:this.color,value:a})},getValue:function(a){a=void 0===a?"#000000":a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),(void 0===b||""===b||null===b)&&(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return this.hasInput()?this.input.prop("disabled")===!0:!1},disable:function(){return this.hasInput()?(this.input.prop("disabled",!0),this.element.trigger({type:"disable",color:this.color,value:this.getValue()}),!0):!1},enable:function(){return this.hasInput()?(this.input.prop("disabled",!1),this.element.trigger({type:"enable",color:this.color,value:this.getValue()}),!0):!1},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){b.pageX||b.pageY||!b.originalEvent||(b.pageX=b.originalEvent.touches[0].pageX,b.pageY=b.originalEvent.touches[0].pageY),b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"touchmove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this),"touchend.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){a.pageX||a.pageY||!a.originalEvent||(a.pageX=a.originalEvent.touches[0].pageX,a.pageY=a.originalEvent.touches[0].pageY),a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/this.currentSlider.maxLeft),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/this.currentSlider.maxTop),"setAlpha"==this.currentSlider.callTop&&this.options.format===!1&&(1!=this.color.value.a?(this.format="rgba",this.color.origFormat="rgba"):(this.format="hex",this.color.origFormat="hex")),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(document).off({"mousemove.colorpicker":this.mousemove,"touchmove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup,"touchend.colorpicker":this.mouseup}),!1},keyup:function(a){if(38===a.keyCode)this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0);else if(40===a.keyCode)this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0);else{var c=this.input.val();this.color=new b(c),this.color.origFormat&&this.options.format===!1&&(this.format=this.color.origFormat),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())}this.element.trigger({type:"changeColor",color:this.color,value:c})}},a.colorpicker=d,a.fn.colorpicker=function(b){var c,e=arguments,f=this.each(function(){var f=a(this),g=f.data("colorpicker"),h="object"==typeof b?b:{};g||"string"==typeof b?"string"==typeof b&&(c=g[b].apply(g,Array.prototype.slice.call(e,1))):f.data("colorpicker",new d(this,h))});return"getValue"===b?c:f},a.fn.colorpicker.constructor=d});
\ No newline at end of file
+!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):window.jQuery&&!window.jQuery.fn.colorpicker&&a(window.jQuery)}(function(a){"use strict";var b=function(a){this.value={h:0,s:0,b:0,a:1},this.origFormat=null,a&&(void 0!==a.toLowerCase?(a+="",this.setColor(a)):void 0!==a.h&&(this.value=a))};b.prototype={constructor:b,colors:{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",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#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",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",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",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:"#d87093",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",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",transparent:"transparent"},_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:void 0!==a.toLowerCase?parseFloat(a):1},isTransparent:function(a){return a?(a=a.toLowerCase().trim(),"transparent"===a||a.match(/#?00000000/)||a.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/)):!1},rgbaIsTransparent:function(a){return 0===a.r&&0===a.g&&0===a.b&&0===a.a},setColor:function(a){a=a.toLowerCase().trim(),a&&(this.isTransparent(a)?this.value={h:0,s:0,b:0,a:0}:this.value=this.stringToHSB(a)||{h:0,s:0,b:0,a:1})},stringToHSB:function(b){b=b.toLowerCase();var c=this,d=!1;return a.each(this.stringParsers,function(a,e){var f=e.re.exec(b),g=f&&e.parse.apply(c,[f]),h=e.format||"rgba";return g?(d=h.match(/hsla?/)?c.RGBtoHSB.apply(c,c.HSLtoRGB.apply(c,g)):c.RGBtoHSB.apply(c,g),c.origFormat=h,!1):!0}),d},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=parseInt(100*(1-a),10)/100},toRGB:function(a,b,c,d){a||(a=this.value.h,b=this.value.s,c=this.value.b),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Math.abs(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],{r:Math.round(255*e),g:Math.round(255*f),b:Math.round(255*g),a:d||this.value.a}},toHex:function(a,b,c,d){var e=this.toRGB(a,b,c,d);return this.rgbaIsTransparent(e)?"transparent":"#"+(1<<24|parseInt(e.r)<<16|parseInt(e.g)<<8|parseInt(e.b)).toString(16).substr(1)},toHSL:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&1>=f?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e=this.toHex(a,b,c,d);for(var f in this.colors)if(this.colors[f]===e)return f;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return 0>c?c+=1:c>1&&(c-=1),1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){0>b&&(b=0);var e;e=.5>=c?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){a=a||"rgba";var b=!1;switch(a){case"rgb":return b=this.toRGB(),this.rgbaIsTransparent(b)?"transparent":"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":return b=this.toRGB(),"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":return b=this.toHSL(),"hsl("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%)";case"hsla":return b=this.toHSL(),"hsla("+Math.round(360*b.h)+","+Math.round(100*b.s)+"%,"+Math.round(100*b.l)+"%,"+b.a+")";case"hex":return this.toHex();case"alias":return this.toAlias()||this.toHex();default:return b}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[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(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}},{re:/^([a-z]{3,})$/,format:"alias",parse:function(a){var b=this.colorNameToHex(a[0])||"#000000",c=this.stringParsers[6].re.exec(b),d=c&&this.stringParsers[6].parse.apply(this,[c]);return d}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]?this.colors[a.toLowerCase()]:!1}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'',align:"right",customClass:null},d=function(d,e){this.element=a(d).addClass("colorpicker-element"),this.options=a.extend(!0,{},c,this.element.data(),e),this.component=this.options.component,this.component=this.component!==!1?this.element.find(this.component):!1,this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1?a(this.container):!1,this.input=this.element.is("input")?this.element:this.options.input?this.element.find(this.options.input):!1,this.input&&0===this.input.length&&(this.input=!1),this.color=new b(this.options.color!==!1?this.options.color:this.getValue()),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.picker=a(this.options.template),this.options.customClass&&this.picker.addClass(this.options.customClass),this.options.inline?this.picker.addClass("colorpicker-inline colorpicker-visible"):this.picker.addClass("colorpicker-hidden"),this.options.horizontal&&this.picker.addClass("colorpicker-horizontal"),("rgba"===this.format||"hsla"===this.format||this.options.format===!1)&&this.picker.addClass("colorpicker-with-alpha"),"right"===this.options.align&&this.picker.addClass("colorpicker-right"),this.picker.on("mousedown.colorpicker touchstart.colorpicker",a.proxy(this.mousedown,this)),this.picker.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.input!==!1&&this.component!==!1&&"color"===this.input.attr("type")&&this.input.on({"click.colorpicker":a.proxy(this.show,this),"focus.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1||this.options.container)return!1;var a=this.container&&this.container[0]!==document.body?"position":"offset",b=this.component||this.element,c=b[a]();"right"===this.options.align&&(c.left-=this.picker.outerWidth()-b.outerWidth()),this.picker.css({top:c.top+b.outerHeight(),left:c.left})},show:function(b){return this.isDisabled()?!1:(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!b||this.hasInput()&&"color"!==this.input.attr("type")||b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),this.options.inline===!1&&a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),void this.element.trigger({type:"showPicker",color:this.color}))},hide:function(){this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(document).off({"mousedown.colorpicker":this.hide}),this.update(),this.element.trigger({type:"hidePicker",color:this.color})},updateData:function(a){return a=a||this.color.toString(this.format),this.element.data("color",a),a},updateInput:function(a){return a=a||this.color.toString(this.format),this.input!==!1&&this.input.prop("value",a),a},updatePicker:function(a){void 0!==a&&(this.color=new b(a));var c=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,d=this.picker.find("i");return 0!==d.length?(this.options.horizontal===!1?(c=this.options.sliders,d.eq(1).css("top",c.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",c.alpha.maxTop*(1-this.color.value.a))):(c=this.options.slidersHorz,d.eq(1).css("left",c.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",c.alpha.maxLeft*(1-this.color.value.a))),d.eq(0).css({top:c.saturation.maxTop-this.color.value.b*c.saturation.maxTop,left:this.color.value.s*c.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format)),a):void 0},updateComponent:function(a){if(a=a||this.color.toString(this.format),this.component!==!1){var b=this.component.find("i").eq(0);b.length>0?b.css({backgroundColor:a}):this.component.css({backgroundColor:a})}return a},update:function(a){var b;return(this.getValue(!1)!==!1||a===!0)&&(b=this.updateComponent(),this.updateInput(b),this.updateData(b),this.updatePicker()),b},setValue:function(a){this.color=new b(a),this.update(),this.element.trigger({type:"changeColor",color:this.color,value:a})},getValue:function(a){a=void 0===a?"#000000":a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),(void 0===b||""===b||null===b)&&(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return this.hasInput()?this.input.prop("disabled")===!0:!1},disable:function(){return this.hasInput()?(this.input.prop("disabled",!0),this.element.trigger({type:"disable",color:this.color,value:this.getValue()}),!0):!1},enable:function(){return this.hasInput()?(this.input.prop("disabled",!1),this.element.trigger({type:"enable",color:this.color,value:this.getValue()}),!0):!1},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){b.pageX||b.pageY||!b.originalEvent||(b.pageX=b.originalEvent.touches[0].pageX,b.pageY=b.originalEvent.touches[0].pageY),b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"touchmove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this),"touchend.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){a.pageX||a.pageY||!a.originalEvent||(a.pageX=a.originalEvent.touches[0].pageX,a.pageY=a.originalEvent.touches[0].pageY),a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/this.currentSlider.maxLeft),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/this.currentSlider.maxTop),"setAlpha"===this.currentSlider.callTop&&this.options.format===!1&&(1!==this.color.value.a?(this.format="rgba",this.color.origFormat="rgba"):(this.format="hex",this.color.origFormat="hex")),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(document).off({"mousemove.colorpicker":this.mousemove,"touchmove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup,"touchend.colorpicker":this.mouseup}),!1},keyup:function(a){38===a.keyCode?(this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0)):40===a.keyCode?(this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0)):(this.color=new b(this.input.val()),this.color.origFormat&&this.options.format===!1&&(this.format=this.color.origFormat),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())),this.element.trigger({type:"changeColor",color:this.color,value:this.input.val()})}},a.colorpicker=d,a.fn.colorpicker=function(b){var c,e=arguments,f=this.each(function(){var f=a(this),g=f.data("colorpicker"),h="object"==typeof b?b:{};g||"string"==typeof b?"string"==typeof b&&(c=g[b].apply(g,Array.prototype.slice.call(e,1))):f.data("colorpicker",new d(this,h))});return"getValue"===b?c:f},a.fn.colorpicker.constructor=d});
\ No newline at end of file
diff --git a/index.html b/index.html
index 41db2e51..3630d510 100644
--- a/index.html
+++ b/index.html
@@ -2,81 +2,86 @@
-
-
-
- Colorpicker for Twitter Bootstrap
-
-
-
-
-
+
+
+
+ Colorpicker for Twitter Bootstrap
+
+
+
-
-
-
-
-
-
- Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by @eyecon and maintained in Github by @mjolnic and the community
-
- It basically adds a color picker to a field or any other element.
-
-
- can be used as a component
- alpha picker
- multiple formats: hex, rgb, rgba, hsl, hsla
-
-
-
-
-
-
-
+
+
+
+
+
+
+ Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by @eyecon and maintained in Github by
+ @mjolnic and the community
+
+ It basically adds a color picker to a field or any other element.
+
+
+ can be used as a component
+ alpha picker
+ multiple formats: hex, rgb, rgba, hsl, hsla
+
+
+
+
+
+
+
-
-
Examples
-
Attached to a field with hex format specified via options:
-
-
+
+
Examples
+
+
Attached to a field with hex format specified via options:
+
+
-
-
As a component:
-
+
+
As a component:
+
+
+
+
+
+
<div class="input-group demo2">
<input type="text" value="" class="form-control" />
@@ -104,49 +110,59 @@ Examples
});
</script>
-
-
-
Using events to work with the color:
-
-
-
Transparent color support:
-
-
-
-
-
Horizonal mode:
-
-
-
-
-
Inline mode:
-
-
-
Custom widget size:
-
-
-
+
+
+
Using events to work with the color:
+
+
+
+
Transparent color support:
+
+
+
+
+
+
Horizonal mode:
+
+
+
+
+
+
Inline mode:
+
+
+
+
Custom widget size:
+
+
-
-
Enabled / disabled
-
-
-
Bootstrap Modal
-
-
-
-
Destroy plugin instances
-
Create instances again
+
+
+
Enabled / disabled
+
+
+
+
Bootstrap Modal
+
+
+
+ Show
+
+
+
+
+
+
+
-
- Documentation
- Call the colopicker via javascript:
- $('.sample-selector').colorpicker({ /*options...*/ });
- Options
-
- You can set colorpicker options either as a plugin parameter or data-* attributes
-
-
-
-
- Name
- Type
- Default
- Description
-
-
-
-
- format
- string
- false
- If not false, forces the color format to be hex, rgb or rgba, otherwise the format is automatically detected.
-
-
- color
- string
- false
- If not false, sets the color to this value.
-
-
- container
- string or jQuery Element
- false
- If not false, the picker will be contained inside this element, otherwise it will be appended to the document body.
-
-
- component
- string or jQuery Element
- '.add-on, .input-group-addon'
- Children selector for the component or element that trigger the colorpicker and which background color will change (needs an inner <i> element).
-
-
- input
- string or jQuery Element
- 'input'
- Children selector for the input that will store the picker selected value.
-
-
- horizontal
- boolean
- false
- If true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.
-
-
- inline
- boolean
- false
- If true, forces to show the colorpicker as an inline element.
-
-
- sliders
- object
- [...]
- Vertical sliders configuration (read source code if you really need to tweak this).
-
-
- slidersHorz
- object
- [...]
- Horizontal sliders configuration (read source code if you really need to tweak this).
-
-
- template
- string
- [...]
- Customizes the default colorpicker HTML template.
-
-
- align
- string
- 'right'
- By default, the colorpicker is aligned to the right of the input. If you need to switch it to the left, set align to 'left'.
-
-
- customClass
- string
- null
- Adds this class to the colorpicker widget.
-
-
-
-
- jQuery API Methods
- General usage methods
- .colorpicker(options)
- Initializes an colorpicker.
-
- .colorpicker('getValue', defaultValue)
- Gets the value from the input or the data attribute (if has no input), otherwise returns the default value, which defaults to #000000 if not specified.
-
- .colorpicker('setValue', value)
- Set a new value for the color picker (also updates everything). Triggers 'changeColor' event.
-
- .colorpicker('show')
- Show the color picker
-
- .colorpicker('hide')
- Hide the color picker
-
- .colorpicker('reposition')
- Updates the color picker's position relative to the element
-
- .colorpicker('update')
- Refreshes the widget colors (this is done automatically)
-
- .colorpicker('enable')
- Enable the color picker.
-
- .colorpicker('disable')
- Disable the color picker.
-
- .colorpicker('destroy')
- Destroys the colorpicker widget and unbind all .colorpicker events from the element and component
-
- .data('colorpicker')
- Access to the colorpicker API directly
-
- .data('colorpicker').color
- Access to the colorpicker Color object information
-
-
-
- Color object methods
- Each triggered events have a color object (avaliable through event.color, see the example at the bottom) used internally by the picker. This object has several useful methods. These are the more commonly used:
-
- .setColor(value)
- Set a new color. The value is parsed and tries to do a quess on the format.
-
- .setHue(value)
- Set the HUE with a value between 0 and 1.
-
- .setSaturation(value)
- Set the saturation with a value between 0 and 1.
-
- .setBrightness(value)
- Set the brightness with a value between 0 and 1.
-
- .setAlpha(value)
- Set the transparency with a value between 0 and 1.
-
- .toRGB()
- Returns a hash with red, green, blue and alpha.
-
- .toHex()
- Returns a string with HEX format for the current color.
-
- .toHSL()
- Returns a hash with HSLA values.
-
-
-
- Events
- The colorpicker plugin exposes some events
-
-
-
-
- Event
- Description
-
-
-
-
- create
- This event fires immediately when the color picker is created.
-
-
- showPicker
- This event fires immediately when the color picker is displayed.
-
-
- hidePicker
- This event is fired immediately when the color picker is hidden.
-
-
- changeColor
- This event is fired when the color is changed.
-
-
- disable
- This event is fired immediately when the color picker is disabled, except if it was initialized as disabled.
-
-
- enable
- This event is fired immediately when the color picker is enabled, except upon initialization.
-
-
- destroy
- This event fires immediately when the color picker is destroyed.
-
-
-
+
+
+
+
+
+
+
+
Destroy
+ plugin instances
+
Create
+ instances again
+
+
+ Documentation
+
+ Call the colopicker via javascript:
+ $('.sample-selector').colorpicker({ /*options...*/ });
+ Options
+
+
+ You can set colorpicker options either as a plugin parameter or data-* attributes
+
+
+
+
+ Name
+ Type
+ Default
+ Description
+
+
+
+
+ format
+ string
+ false
+ If not false, forces the color format to be hex, rgb or rgba, otherwise the format is
+ automatically detected.
+
+
+
+ color
+ string
+ false
+ If not false, sets the color to this value.
+
+
+ container
+ string or jQuery Element
+ false
+ If not false, the picker will be contained inside this element, otherwise it will be
+ appended to the document body.
+
+
+
+ component
+ string or jQuery Element
+ '.add-on, .input-group-addon'
+ Children selector for the component or element that trigger the colorpicker and which
+ background color will change (needs an inner <i> element).
+
+
+
+ input
+ string or jQuery Element
+ 'input'
+ Children selector for the input that will store the picker selected value.
+
+
+ horizontal
+ boolean
+ false
+ If true, the hue and alpha channel bars will be rendered horizontally, above the saturation
+ selector.
+
+
+
+ inline
+ boolean
+ false
+ If true, forces to show the colorpicker as an inline element.
+
+
+ sliders
+ object
+ [...]
+ Vertical sliders configuration (read source code if you really need to tweak this).
+
+
+ slidersHorz
+ object
+ [...]
+ Horizontal sliders configuration (read source code if you really need to tweak this).
+
+
+ template
+ string
+ [...]
+ Customizes the default colorpicker HTML template.
+
+
+ align
+ string
+ 'right'
+ By default, the colorpicker is aligned to the right of the input. If you need to switch it
+ to the left, set align to 'left'.
+
+
+
+ customClass
+ string
+ null
+ Adds this class to the colorpicker widget.
+
+
+
+
+ jQuery API Methods
+
+ General usage methods
+ .colorpicker(options)
+
+ Initializes an colorpicker.
+
+ .colorpicker('getValue', defaultValue)
+
+ Gets the value from the input or the data attribute (if has no input), otherwise returns the default
+ value, which defaults to #000000 if not specified.
+
+ .colorpicker('setValue', value)
+
+ Set a new value for the color picker (also updates everything). Triggers 'changeColor' event.
+
+ .colorpicker('show')
+
+ Show the color picker
+
+ .colorpicker('hide')
+
+ Hide the color picker
+
+ .colorpicker('reposition')
+
+ Updates the color picker's position relative to the element
+
+ .colorpicker('update')
+
+ Refreshes the widget colors (this is done automatically)
+
+ .colorpicker('enable')
+
+ Enable the color picker.
+
+ .colorpicker('disable')
+
+ Disable the color picker.
+
+ .colorpicker('destroy')
+
+ Destroys the colorpicker widget and unbind all .colorpicker events from the element and component
+
+ .data('colorpicker')
+
+ Access to the colorpicker API directly
+
+ .data('colorpicker').color
+
+ Access to the colorpicker Color object information
+
+
+
+ Color object methods
+
+ Each triggered events have a color object (avaliable through event.color, see the example at the
+ bottom) used internally by the picker. This object has several useful methods. These are the more
+ commonly used:
+
+ .setColor(value)
+
+ Set a new color. The value is parsed and tries to do a quess on the format.
+
+ .setHue(value)
+
+ Set the HUE with a value between 0 and 1.
+
+ .setSaturation(value)
+
+ Set the saturation with a value between 0 and 1.
+
+ .setBrightness(value)
+
+ Set the brightness with a value between 0 and 1.
+
+ .setAlpha(value)
+
+ Set the transparency with a value between 0 and 1.
+
+ .toRGB()
+
+ Returns a hash with red, green, blue and alpha.
+
+ .toHex()
+
+ Returns a string with HEX format for the current color.
+
+ .toHSL()
+
+ Returns a hash with HSLA values.
+
+
+
+ Events
+
+ The colorpicker plugin exposes some events
+
+
+
+
+ Event
+ Description
+
+
+
+
+ create
+ This event fires immediately when the color picker is created.
+
+
+ showPicker
+ This event fires immediately when the color picker is displayed.
+
+
+ hidePicker
+ This event is fired immediately when the color picker is hidden.
+
+
+ changeColor
+ This event is fired when the color is changed.
+
+
+ disable
+ This event is fired immediately when the color picker is disabled, except if it was
+ initialized as disabled.
+
+
+
+ enable
+ This event is fired immediately when the color picker is enabled, except upon
+ initialization.
+
+
+
+ destroy
+ This event fires immediately when the color picker is destroyed.
+
+
+
$('.my-colorpicker').colorpicker().on('changeColor.colorpicker', function(event){
bodyStyle.backgroundColor = event.color.toHex();
});
-
-
-
+
-
-
-
-
+
+
+
+
+
+
-
\ No newline at end of file
+