@@ -208,7 +208,82 @@ var form_handlers = function (el) {
208208 if ( l2 > l1 ) { ratio = 1 / ratio }
209209 return ratio . toFixed ( 1 )
210210 }
211- el . find ( ".colorpickerfield" ) . colorpicker ( {
211+
212+ function getColorFieldHost ( $input ) {
213+ var $formGroup = $input . closest ( '.form-group' ) ,
214+ $host = $formGroup . find ( '.col-md-9, .col-sm-9, .col-lg-9, .col-xs-12' ) . first ( ) ;
215+ if ( $host . length ) {
216+ return $host ;
217+ }
218+ return $formGroup . length ? $formGroup : $input . parent ( ) ;
219+ }
220+
221+ function ensureColorPreview ( $input ) {
222+ var $host = getColorFieldHost ( $input ) ,
223+ $wrapper = $input . closest ( '.colorpicker-preview-group' ) ;
224+ if ( ! $wrapper . length ) {
225+ $wrapper = $ ( '<div class="colorpicker-preview-group"></div>' ) ;
226+ $input . before ( $wrapper ) ;
227+ $wrapper . append ( $input ) ;
228+ } else if ( $wrapper . parent ( ) [ 0 ] !== $host [ 0 ] ) {
229+ $wrapper . appendTo ( $host ) ;
230+ }
231+ var $preview = $wrapper . find ( '.colorpicker-preview' ) ;
232+ if ( ! $preview . length ) {
233+ $preview = $ ( '<span class="colorpicker-preview" aria-hidden="true"></span>' ) ;
234+ $wrapper . prepend ( $preview ) ;
235+ }
236+ return { preview : $preview , host : $host } ;
237+ }
238+
239+ function updateColorPreview ( $input , color ) {
240+ var parts = ensureColorPreview ( $input ) ,
241+ $preview = parts . preview ,
242+ value = color || $input . val ( ) ;
243+ if ( value ) {
244+ $preview . removeClass ( 'is-empty' ) ;
245+ $preview . css ( 'background-color' , value ) ;
246+ } else {
247+ $preview . addClass ( 'is-empty' ) ;
248+ $preview . css ( 'background-color' , '' ) ;
249+ }
250+ return parts . host ;
251+ }
252+
253+ function updateContrastState ( $input , rgb ) {
254+ var $host = getColorFieldHost ( $input ) ,
255+ $note = $host . find ( ".contrast-state" ) ;
256+ if ( ! $input . val ( ) || ! rgb || $input . is ( ".no-contrast" ) ) {
257+ $note . remove ( ) ;
258+ return ;
259+ }
260+ if ( ! $note . length ) {
261+ $note = $ ( "<div class='help-block contrast-state'></div>" ) ;
262+ $host . append ( $note ) ;
263+ }
264+ var c = contrast ( [ 255 , 255 , 255 ] , [ rgb . r , rgb . g , rgb . b ] ) ;
265+ if ( c > 7 ) {
266+ $note . html ( "<span class='fa fa-fw fa-check-circle'></span>" )
267+ . append ( gettext ( 'Your color has great contrast and is very easy to read!' ) ) ;
268+ $note . addClass ( "text-success" ) . removeClass ( "text-warning" ) . removeClass ( "text-danger" ) ;
269+ } else if ( c > 2.5 ) {
270+ $note . html ( "<span class='fa fa-fw fa-info-circle'></span>" )
271+ . append ( gettext ( 'Your color has decent contrast and is probably good-enough to read!' ) ) ;
272+ $note . removeClass ( "text-success" ) . removeClass ( "text-warning" ) . removeClass ( "text-danger" ) ;
273+ } else {
274+ $note . html ( "<span class='fa fa-fw fa-warning'></span>" )
275+ . append ( gettext ( 'Your color has bad contrast for text on white background, please choose a darker ' +
276+ 'shade.' ) ) ;
277+ $note . addClass ( "text-danger" ) . removeClass ( "text-success" ) . removeClass ( "text-warning" ) ;
278+ }
279+ }
280+
281+ var $colorInputs = el . find ( ".colorpickerfield" ) ;
282+ $colorInputs . each ( function ( ) {
283+ updateColorPreview ( $ ( this ) ) ;
284+ } ) ;
285+
286+ $colorInputs . colorpicker ( {
212287 format : 'hex' ,
213288 align : 'left' ,
214289 customClass : 'colorpicker-2x' ,
@@ -225,32 +300,16 @@ var form_handlers = function (el) {
225300 }
226301 }
227302 } ) . on ( 'changeColor create' , function ( e ) {
228- var rgb = $ ( this ) . colorpicker ( 'color' ) . toRGB ( ) ;
229- var c = contrast ( [ 255 , 255 , 255 ] , [ rgb . r , rgb . g , rgb . b ] ) ;
230- var mark = 'times' ;
231- if ( $ ( this ) . parent ( ) . find ( ".contrast-state" ) . length === 0 ) {
232- $ ( this ) . parent ( ) . append ( "<div class='help-block contrast-state'></div>" ) ;
233- }
234- var $note = $ ( this ) . parent ( ) . find ( ".contrast-state" ) ;
235- if ( $ ( this ) . val ( ) === "" ) {
236- $note . remove ( ) ;
237- }
238- if ( ! $ ( this ) . is ( ".no-contrast" ) ) {
239- if ( c > 7 ) {
240- $note . html ( "<span class='fa fa-fw fa-check-circle'></span>" )
241- . append ( gettext ( 'Your color has great contrast and is very easy to read!' ) ) ;
242- $note . addClass ( "text-success" ) . removeClass ( "text-warning" ) . removeClass ( "text-danger" ) ;
243- } else if ( c > 2.5 ) {
244- $note . html ( "<span class='fa fa-fw fa-info-circle'></span>" )
245- . append ( gettext ( 'Your color has decent contrast and is probably good-enough to read!' ) ) ;
246- $note . removeClass ( "text-success" ) . removeClass ( "text-warning" ) . removeClass ( "text-danger" ) ;
247- } else {
248- $note . html ( "<span class='fa fa-fw fa-warning'></span>" )
249- . append ( gettext ( 'Your color has bad contrast for text on white background, please choose a darker ' +
250- 'shade.' ) ) ;
251- $note . addClass ( "text-danger" ) . removeClass ( "text-success" ) . removeClass ( "text-warning" ) ;
252- }
253- }
303+ var $input = $ ( this ) ,
304+ pickerColor = e . color || ( $input . colorpicker ? $input . colorpicker ( 'color' ) : null ) ,
305+ rgb = pickerColor && pickerColor . toRGB ? pickerColor . toRGB ( ) : null ,
306+ colorString = pickerColor && pickerColor . toString ? pickerColor . toString ( ) : null ;
307+ updateColorPreview ( $input , colorString ) ;
308+ updateContrastState ( $input , rgb ) ;
309+ } ) ;
310+
311+ $colorInputs . on ( 'input' , function ( ) {
312+ updateColorPreview ( $ ( this ) ) ;
254313 } ) ;
255314
256315 el . find ( "input[data-checkbox-dependency]" ) . each ( function ( ) {
0 commit comments