Spaces:
Sleeping
Sleeping
/** | |
* @output wp-admin/js/color-picker.js | |
*/ | |
( function( $, undef ) { | |
var ColorPicker, | |
_before = '<button type="button" class="button wp-color-result" aria-expanded="false"><span class="wp-color-result-text"></span></button>', | |
_after = '<div class="wp-picker-holder" />', | |
_wrap = '<div class="wp-picker-container" />', | |
_button = '<input type="button" class="button button-small" />', | |
_wrappingLabel = '<label></label>', | |
_wrappingLabelText = '<span class="screen-reader-text"></span>', | |
__ = wp.i18n.__; | |
/** | |
* Creates a jQuery UI color picker that is used in the theme customizer. | |
* | |
* @class $.widget.wp.wpColorPicker | |
* | |
* @since 3.5.0 | |
*/ | |
ColorPicker = /** @lends $.widget.wp.wpColorPicker.prototype */{ | |
options: { | |
defaultColor: false, | |
change: false, | |
clear: false, | |
hide: true, | |
palettes: true, | |
width: 255, | |
mode: 'hsv', | |
type: 'full', | |
slider: 'horizontal' | |
}, | |
/** | |
* Creates a color picker that only allows you to adjust the hue. | |
* | |
* @since 3.5.0 | |
* @access private | |
* | |
* @return {void} | |
*/ | |
_createHueOnly: function() { | |
var self = this, | |
el = self.element, | |
color; | |
el.hide(); | |
// Set the saturation to the maximum level. | |
color = 'hsl(' + el.val() + ', 100, 50)'; | |
// Create an instance of the color picker, using the hsl mode. | |
el.iris( { | |
mode: 'hsl', | |
type: 'hue', | |
hide: false, | |
color: color, | |
/** | |
* Handles the onChange event if one has been defined in the options. | |
* | |
* @ignore | |
* | |
* @param {Event} event The event that's being called. | |
* @param {HTMLElement} ui The HTMLElement containing the color picker. | |
* | |
* @return {void} | |
*/ | |
change: function( event, ui ) { | |
if ( typeof self.options.change === 'function' ) { | |
self.options.change.call( this, event, ui ); | |
} | |
}, | |
width: self.options.width, | |
slider: self.options.slider | |
} ); | |
}, | |
/** | |
* Creates the color picker, sets default values, css classes and wraps it all in HTML. | |
* | |
* @since 3.5.0 | |
* @access private | |
* | |
* @return {void} | |
*/ | |
_create: function() { | |
// Return early if Iris support is missing. | |
if ( ! $.support.iris ) { | |
return; | |
} | |
var self = this, | |
el = self.element; | |
// Override default options with options bound to the element. | |
$.extend( self.options, el.data() ); | |
// Create a color picker which only allows adjustments to the hue. | |
if ( self.options.type === 'hue' ) { | |
return self._createHueOnly(); | |
} | |
// Bind the close event. | |
self.close = self.close.bind( self ); | |
self.initialValue = el.val(); | |
// Add a CSS class to the input field. | |
el.addClass( 'wp-color-picker' ); | |
/* | |
* Check if there's already a wrapping label, e.g. in the Customizer. | |
* If there's no label, add a default one to match the Customizer template. | |
*/ | |
if ( ! el.parent( 'label' ).length ) { | |
// Wrap the input field in the default label. | |
el.wrap( _wrappingLabel ); | |
// Insert the default label text. | |
self.wrappingLabelText = $( _wrappingLabelText ) | |
.insertBefore( el ) | |
.text( __( 'Color value' ) ); | |
} | |
/* | |
* At this point, either it's the standalone version or the Customizer | |
* one, we have a wrapping label to use as hook in the DOM, let's store it. | |
*/ | |
self.wrappingLabel = el.parent(); | |
// Wrap the label in the main wrapper. | |
self.wrappingLabel.wrap( _wrap ); | |
// Store a reference to the main wrapper. | |
self.wrap = self.wrappingLabel.parent(); | |
// Set up the toggle button and insert it before the wrapping label. | |
self.toggler = $( _before ) | |
.insertBefore( self.wrappingLabel ) | |
.css( { backgroundColor: self.initialValue } ); | |
// Set the toggle button span element text. | |
self.toggler.find( '.wp-color-result-text' ).text( __( 'Select Color' ) ); | |
// Set up the Iris container and insert it after the wrapping label. | |
self.pickerContainer = $( _after ).insertAfter( self.wrappingLabel ); | |
// Store a reference to the Clear/Default button. | |
self.button = $( _button ); | |
// Set up the Clear/Default button. | |
if ( self.options.defaultColor ) { | |
self.button | |
.addClass( 'wp-picker-default' ) | |
.val( __( 'Default' ) ) | |
.attr( 'aria-label', __( 'Select default color' ) ); | |
} else { | |
self.button | |
.addClass( 'wp-picker-clear' ) | |
.val( __( 'Clear' ) ) | |
.attr( 'aria-label', __( 'Clear color' ) ); | |
} | |
// Wrap the wrapping label in its wrapper and append the Clear/Default button. | |
self.wrappingLabel | |
.wrap( '<span class="wp-picker-input-wrap hidden" />' ) | |
.after( self.button ); | |
/* | |
* The input wrapper now contains the label+input+Clear/Default button. | |
* Store a reference to the input wrapper: we'll use this to toggle | |
* the controls visibility. | |
*/ | |
self.inputWrapper = el.closest( '.wp-picker-input-wrap' ); | |
el.iris( { | |
target: self.pickerContainer, | |
hide: self.options.hide, | |
width: self.options.width, | |
mode: self.options.mode, | |
palettes: self.options.palettes, | |
/** | |
* Handles the onChange event if one has been defined in the options and additionally | |
* sets the background color for the toggler element. | |
* | |
* @since 3.5.0 | |
* | |
* @ignore | |
* | |
* @param {Event} event The event that's being called. | |
* @param {HTMLElement} ui The HTMLElement containing the color picker. | |
* | |
* @return {void} | |
*/ | |
change: function( event, ui ) { | |
self.toggler.css( { backgroundColor: ui.color.toString() } ); | |
if ( typeof self.options.change === 'function' ) { | |
self.options.change.call( this, event, ui ); | |
} | |
} | |
} ); | |
el.val( self.initialValue ); | |
self._addListeners(); | |
// Force the color picker to always be closed on initial load. | |
if ( ! self.options.hide ) { | |
self.toggler.click(); | |
} | |
}, | |
/** | |
* Binds event listeners to the color picker. | |
* | |
* @since 3.5.0 | |
* @access private | |
* | |
* @return {void} | |
*/ | |
_addListeners: function() { | |
var self = this; | |
/** | |
* Prevent any clicks inside this widget from leaking to the top and closing it. | |
* | |
* @since 3.5.0 | |
* | |
* @param {Event} event The event that's being called. | |
* | |
* @return {void} | |
*/ | |
self.wrap.on( 'click.wpcolorpicker', function( event ) { | |
event.stopPropagation(); | |
}); | |
/** | |
* Open or close the color picker depending on the class. | |
* | |
* @since 3.5.0 | |
*/ | |
self.toggler.on( 'click', function(){ | |
if ( self.toggler.hasClass( 'wp-picker-open' ) ) { | |
self.close(); | |
} else { | |
self.open(); | |
} | |
}); | |
/** | |
* Checks if value is empty when changing the color in the color picker. | |
* If so, the background color is cleared. | |
* | |
* @since 3.5.0 | |
* | |
* @param {Event} event The event that's being called. | |
* | |
* @return {void} | |
*/ | |
self.element.on( 'change', function( event ) { | |
var me = $( this ), | |
val = me.val(); | |
if ( val === '' || val === '#' ) { | |
self.toggler.css( 'backgroundColor', '' ); | |
// Fire clear callback if we have one. | |
if ( typeof self.options.clear === 'function' ) { | |
self.options.clear.call( this, event ); | |
} | |
} | |
}); | |
/** | |
* Enables the user to either clear the color in the color picker or revert back to the default color. | |
* | |
* @since 3.5.0 | |
* | |
* @param {Event} event The event that's being called. | |
* | |
* @return {void} | |
*/ | |
self.button.on( 'click', function( event ) { | |
var me = $( this ); | |
if ( me.hasClass( 'wp-picker-clear' ) ) { | |
self.element.val( '' ); | |
self.toggler.css( 'backgroundColor', '' ); | |
if ( typeof self.options.clear === 'function' ) { | |
self.options.clear.call( this, event ); | |
} | |
} else if ( me.hasClass( 'wp-picker-default' ) ) { | |
self.element.val( self.options.defaultColor ).change(); | |
} | |
}); | |
}, | |
/** | |
* Opens the color picker dialog. | |
* | |
* @since 3.5.0 | |
* | |
* @return {void} | |
*/ | |
open: function() { | |
this.element.iris( 'toggle' ); | |
this.inputWrapper.removeClass( 'hidden' ); | |
this.wrap.addClass( 'wp-picker-active' ); | |
this.toggler | |
.addClass( 'wp-picker-open' ) | |
.attr( 'aria-expanded', 'true' ); | |
$( 'body' ).trigger( 'click.wpcolorpicker' ).on( 'click.wpcolorpicker', this.close ); | |
}, | |
/** | |
* Closes the color picker dialog. | |
* | |
* @since 3.5.0 | |
* | |
* @return {void} | |
*/ | |
close: function() { | |
this.element.iris( 'toggle' ); | |
this.inputWrapper.addClass( 'hidden' ); | |
this.wrap.removeClass( 'wp-picker-active' ); | |
this.toggler | |
.removeClass( 'wp-picker-open' ) | |
.attr( 'aria-expanded', 'false' ); | |
$( 'body' ).off( 'click.wpcolorpicker', this.close ); | |
}, | |
/** | |
* Returns the iris object if no new color is provided. If a new color is provided, it sets the new color. | |
* | |
* @param newColor {string|*} The new color to use. Can be undefined. | |
* | |
* @since 3.5.0 | |
* | |
* @return {string} The element's color. | |
*/ | |
color: function( newColor ) { | |
if ( newColor === undef ) { | |
return this.element.iris( 'option', 'color' ); | |
} | |
this.element.iris( 'option', 'color', newColor ); | |
}, | |
/** | |
* Returns the iris object if no new default color is provided. | |
* If a new default color is provided, it sets the new default color. | |
* | |
* @param newDefaultColor {string|*} The new default color to use. Can be undefined. | |
* | |
* @since 3.5.0 | |
* | |
* @return {boolean|string} The element's color. | |
*/ | |
defaultColor: function( newDefaultColor ) { | |
if ( newDefaultColor === undef ) { | |
return this.options.defaultColor; | |
} | |
this.options.defaultColor = newDefaultColor; | |
} | |
}; | |
// Register the color picker as a widget. | |
$.widget( 'wp.wpColorPicker', ColorPicker ); | |
}( jQuery ) ); | |