@@ -17,6 +17,7 @@ import "./contrastToolUtils.js";
1717 Observable = kendo . Observable ,
1818 parseColor = kendo . parseColor ,
1919 extend = $ . extend ,
20+ encode = kendo . htmlEncode ,
2021 Color = kendo . Color ,
2122 KEYS = kendo . keys ,
2223 BACKGROUNDCOLOR = "background-color" ,
@@ -46,9 +47,8 @@ import "./contrastToolUtils.js";
4647 that . _viewModel = kendo . observable ( {
4748 switchMode : that . switchMode . bind ( that ) ,
4849 keydown : that . keydown . bind ( that ) ,
49- mode : function ( mode ) {
50- return mode === this . get ( "format" ) ;
51- } ,
50+ isHEXMode : function ( ) { return this . get ( "format" ) === 'hex' } ,
51+ isRGBMode : function ( ) { return this . get ( "format" ) === 'rgb' } ,
5252 format : options . format ,
5353 formats : options . formats ,
5454 rgb : null ,
@@ -67,44 +67,66 @@ import "./contrastToolUtils.js";
6767
6868 Observable . fn . init . call ( that ) ;
6969 } ,
70- _template : kendo . template (
71- '# if (options.formats && options.formats.length > 1) { #' +
72- '<div class="k-vstack">' +
73- '<button class="k-colorgradient-toggle-mode" data-#:ns#role="button" data-#:ns#icon="arrows-kpi" data data-#:ns#bind="click: switchMode" data-#:ns#fill-mode="flat" data-#:ns#size="#: options.size #" title="#: options.messages.toggleFormat #">' +
74- '</button>' +
75- '</div>' +
76- '# } #' +
70+ _template : kendo . template ( ( { options , ns } ) => {
71+ let optionsSize = encode ( options . size ) ;
72+ let optionsTabIndex = encode ( options . tabindex ) ;
73+
74+ let vStackElement = "" ;
75+ if ( options . formats && options . formats . length > 1 ) {
76+ let optionsMessagesToggleFormat = encode ( options . messages . toggleFormat ) ;
7777
78+ vStackElement =
79+ '<div class="k-vstack">' +
80+ `<button class="k-colorgradient-toggle-mode" data-${ ns } role="button" data-${ ns } icon="arrows-kpi" data data-${ ns } bind="click: switchMode" data-${ ns } fill-mode="flat" data-${ ns } size="${ optionsSize } " title="${ optionsMessagesToggleFormat } ">` +
81+ '</button>' +
82+ '</div>' ;
83+ }
7884
7985 // HEX input
80- '# if (options.formats && options.formats.indexOf("hex") >= 0) { #' +
81- '<div class="k-vstack k-flex-1" data-#:ns#bind="visible: mode(\'hex\')">' +
82- '<input type="text" data-#:ns#bind="value: hex" data-#:ns#role="textbox" data-#:ns#size="#: options.size #" tabindex="#:options.tabindex#" aria-label="#: options.messages.hex #"/>' +
83- '<label class="k-colorgradient-input-label">HEX</label>' +
84- '</div>' +
85- '# } #' +
86+ let hexInputElement = "" ;
87+ if ( options . formats && options . formats . indexOf ( "hex" ) >= 0 ) {
88+ let optionsMessagesHex = encode ( options . messages . hex ) ;
89+
90+ hexInputElement =
91+ `<div class="k-vstack k-flex-1" data-${ ns } bind="visible: isHEXMode">` +
92+ `<input type="text" data-${ ns } bind="value: hex" data-${ ns } role="textbox" data-${ ns } size="${ optionsSize } " tabindex="${ optionsTabIndex } " aria-label="${ optionsMessagesHex } "/>` +
93+ '<label class="k-colorgradient-input-label">HEX</label>' +
94+ '</div>'
95+ }
8696
8797 // RGBA input
88- '# if (options.formats && options.formats.indexOf("rgb") >= 0) { #' +
89- '<div class="k-vstack" data-#:ns#bind="visible: mode(\'rgb\')">' +
90- '<input tabindex="#:options.tabindex#" data-#:ns#bind="value: rgb.r" data-#:ns#role="numerictextbox" data-#:ns#size="#: options.size #" data-#:ns#max="255" data-#:ns#min="0" data-#:ns#decimals="0" data-#:ns#spinners="false" data-#:ns#format="n0" aria-label="#: options.messages.red #" />' +
91- '<label class="k-colorgradient-input-label">R</label>' +
92- '</div>' +
93- '<div class="k-vstack" data-#:ns#bind="visible: mode(\'rgb\')">' +
94- '<input tabindex="#:options.tabindex#" data-#:ns#bind="value: rgb.g" data-#:ns#role="numerictextbox" data-#:ns#size="#: options.size #" data-#:ns#max="255" data-#:ns#min="0" data-#:ns#decimals="0" data-#:ns#spinners="false" data-#:ns#format="n0" aria-label="#: options.messages.green #" />' +
95- '<label class="k-colorgradient-input-label">G</label>' +
96- '</div>' +
97- '<div class="k-vstack" data-#:ns#bind="visible: mode(\'rgb\')">' +
98- '<input tabindex="#:options.tabindex#" data-#:ns#bind="value: rgb.b" data-#:ns#role="numerictextbox" data-#:ns#size="#: options.size #" data-#:ns#max="255" data-#:ns#min="0" data-#:ns#decimals="0" data-#:ns#spinners="false" data-#:ns#format="n0" aria-label="#: options.messages.blue #"/>' +
99- '<label class="k-colorgradient-input-label">B</label>' +
100- '</div>' +
101- '#if(options.opacity){#' +
102- '<div class="k-vstack" data-#:ns#bind="visible: mode(\'rgb\')">' +
103- '<input tabindex="#:options.tabindex#" data-#:ns#bind="value: rgb.a" data-#:ns#role="numerictextbox" data-#:ns#size="#: options.size #" data-#:ns#step="0.1" data-#:ns#max="1" data-#:ns#min="0" data-#:ns#decimals="1" data-#:ns#spinners="false" data-#:ns#format="n1" aria-label="#: options.messages.alpha #" />' +
104- '<label class="k-colorgradient-input-label">A</label>' +
105- '</div>' +
106- '# } #' +
107- '# } #' ) ,
98+ let rgbaInputElement = "" ;
99+ if ( options . formats && options . formats . indexOf ( "rgb" ) >= 0 ) {
100+ let optionsMessagesRed = encode ( options . messages . red ) ;
101+ let optionsMessagesGreen = encode ( options . messages . green ) ;
102+ let optionsMessagesBlue = encode ( options . messages . blue ) ;
103+
104+ rgbaInputElement =
105+ `<div class="k-vstack" data-${ ns } bind="visible: isRGBMode">` +
106+ `<input tabindex="${ optionsTabIndex } " data-${ ns } bind="value: rgb.r" data-${ ns } role="numerictextbox" data-${ ns } size="${ optionsSize } " data-${ ns } max="255" data-${ ns } min="0" data-${ ns } decimals="0" data-${ ns } spinners="false" data-${ ns } format="n0" aria-label="${ optionsMessagesRed } " />` +
107+ '<label class="k-colorgradient-input-label">R</label>' +
108+ '</div>' +
109+ `<div class="k-vstack" data-${ ns } bind="visible: isRGBMode">` +
110+ `<input tabindex="${ optionsTabIndex } " data-${ ns } bind="value: rgb.g" data-${ ns } role="numerictextbox" data-${ ns } size="${ optionsSize } " data-${ ns } max="255" data-${ ns } min="0" data-${ ns } decimals="0" data-${ ns } spinners="false" data-${ ns } format="n0" aria-label="${ optionsMessagesGreen } " />` +
111+ '<label class="k-colorgradient-input-label">G</label>' +
112+ '</div>' +
113+ `<div class="k-vstack" data-${ ns } bind="visible: isRGBMode">` +
114+ `<input tabindex="${ optionsTabIndex } " data-${ ns } bind="value: rgb.b" data-${ ns } role="numerictextbox" data-${ ns } size="${ optionsSize } " data-${ ns } max="255" data-${ ns } min="0" data-${ ns } decimals="0" data-${ ns } spinners="false" data-${ ns } format="n0" aria-label="${ optionsMessagesBlue } "/>` +
115+ '<label class="k-colorgradient-input-label">B</label>' +
116+ '</div>' ;
117+
118+ if ( options . opacity ) {
119+ let optionsMessagesAlpha = options . messages . alpha ;
120+ rgbaInputElement +=
121+ `<div class="k-vstack" data-${ ns } bind="visible: isRGBMode">` +
122+ `<input tabindex="${ optionsTabIndex } " data-${ ns } bind="value: rgb.a" data-${ ns } role="numerictextbox" data-${ ns } size="${ optionsSize } " data-${ ns } step="0.1" data-${ ns } max="1" data-${ ns } min="0" data-${ ns } decimals="1" data-${ ns } spinners="false" data-${ ns } format="n1" aria-label="${ optionsMessagesAlpha } " />` +
123+ '<label class="k-colorgradient-input-label">A</label>' +
124+ '</div>' ;
125+ }
126+ }
127+
128+ return vStackElement + hexInputElement + rgbaInputElement ;
129+ } ) ,
108130 destroy : function ( ) {
109131 var that = this ;
110132
@@ -222,7 +244,7 @@ import "./contrastToolUtils.js";
222244 options : {
223245 name : "ColorGradient" ,
224246 opacity : false ,
225- hsvDragARIATemplate : ' Color well with two-dimensional slider for selecting saturation and value. Selected color is #= data || "none"#' ,
247+ hsvDragARIATemplate : ( data ) => ` Color well with two-dimensional slider for selecting saturation and value. Selected color is ${ data || "none" } ` ,
226248 input : true ,
227249 format : "hex" ,
228250 formats : [ "rgb" , "hex" ] ,
@@ -241,27 +263,16 @@ import "./contrastToolUtils.js";
241263 } ,
242264 _otOfPicker : true
243265 } ,
244- _template : kendo . template (
245- '<div class="k-colorgradient-canvas k-hstack">' +
246- '<div class="k-hsv-rectangle"><div class="k-hsv-gradient"></div><div role="slider" aria-orientation="undefined" class="k-hsv-draghandle k-draghandle"></div></div>' +
247-
248- '<div class="k-hsv-controls k-hstack">' +
249- '<input class="k-hue-slider k-colorgradient-slider" />' +
250- '# if (opacity) { #' +
251- '<input class="k-alpha-slider k-colorgradient-slider" />' +
252- '# } #' +
253- '</div>' +
254- '</div>' +
255-
256- '# if (input) { #' +
257- '<div class="k-colorgradient-inputs k-hstack">' +
258- '</div>' +
259- '# } #' +
260-
261- '# if (contrastTool) { #' +
262- '<div class="k-colorgradient-color-contrast k-vbox">' +
266+ _template : kendo . template ( ( options ) =>
267+ '<div class="k-colorgradient-canvas k-hstack">' +
268+ '<div class="k-hsv-rectangle"><div class="k-hsv-gradient"></div><div role="slider" aria-orientation="undefined" class="k-hsv-draghandle k-draghandle"></div></div>' +
269+ '<div class="k-hsv-controls k-hstack">' +
270+ '<input class="k-hue-slider k-colorgradient-slider" />' +
271+ ( options . opacity ? '<input class="k-alpha-slider k-colorgradient-slider" />' : '' ) +
272+ '</div>' +
263273 '</div>' +
264- '# } #'
274+ ( options . input ? '<div class="k-colorgradient-inputs k-hstack"></div>' : '' ) +
275+ ( options . contrastTool ? '<div class="k-colorgradient-color-contrast k-vbox"></div>' : '' )
265276 ) ,
266277 focus : function ( ) {
267278 this . _hsvHandle . focus ( ) ;
@@ -518,23 +529,20 @@ import "./contrastToolUtils.js";
518529 contrastOptions = that . options . contrastTool ,
519530 backgroundColor = contrastOptions . backgroundColor ? parseColor ( contrastOptions . backgroundColor ) : parseColor ( WHITE ) ,
520531 contrastRatio = contrastToolUtils . getContrastFromTwoRGBAs ( parseColor ( color . toCssRgba ( ) ) , backgroundColor ) ,
521- contrastRatioTemplate = kendo . template ( '<div class="k-contrast-ratio">' +
522- '<span class="k-contrast-ratio-text">#:messages.contrastRatio# #:kendo.toString(ratio, "n2")#</span>' +
523- '<span class="k-contrast-validation k-text-success">' +
524- '#if (ratio > 4.5) {#' +
525- '<span class="k-icon k-i-check"></span>' +
526- '#}#' +
527- '#if (ratio > 7) {#' +
528- '<span class="k-icon k-i-check"></span>' +
529- '#}#' +
532+ contrastRatioTemplate = kendo . template ( ( { messages, ratio } ) =>
533+ '<div class="k-contrast-ratio">' +
534+ `<span class="k-contrast-ratio-text">${ encode ( messages . contrastRatio ) } ${ encode ( kendo . toString ( ratio , "n2" ) ) } </span>` +
535+ '<span class="k-contrast-validation k-text-success">' +
536+ ( ratio > 4.5 ? '<span class="k-icon k-i-check"></span>' : '' ) +
537+ ( ratio > 7 ? '<span class="k-icon k-i-check"></span>' : '' ) +
530538 '</span></div>' ) ,
531- labelTemplate = kendo . template ( '<div>' +
532- '<span>#:level#: #:limit# </span >' +
533- '#if (ratio > limit) {#' +
534- '<span class="k-contrast-validation k-text-success">#:messages.pass# <span class="k-icon k-i-check"></span></span>' +
535- '#} else {#' +
536- '<span class="k-contrast-validation k-text-error">#:messages.fail# <span class="k-icon k-i-close"></span></span>' +
537- '#}#' +
539+ labelTemplate = kendo . template ( ( { messages , ratio , limit , level } ) =>
540+ '<div >' +
541+ `<span> ${ encode ( level ) } : ${ encode ( limit ) } </span>` +
542+ ( ratio > limit ?
543+ `<span class="k-contrast-validation k-text-success"> ${ encode ( messages . pass ) } <span class="k-icon k-i-check"></span></span>`
544+ :
545+ `<span class="k-contrast-validation k-text-error"> ${ encode ( messages . fail ) } <span class="k-icon k-i-close"></span></span>` ) +
538546 '</div>' ) ,
539547 output = "" ;
540548
0 commit comments