(colors, background, scaleType, level)
| 15 | import chroma from 'chroma-js'; |
| 16 | |
| 17 | function createPanelReportTable(colors, background, scaleType, level) { |
| 18 | if (!colors) { |
| 19 | const colorClass = scaleType === 'sequential' ? _sequentialScale : _divergingScale; |
| 20 | let scaleColors = colorClass.colors; |
| 21 | if (scaleType === 'sequential') { |
| 22 | colors = [scaleColors[0], scaleColors[scaleColors.length - 1]]; |
| 23 | } else { |
| 24 | colors = [scaleColors[0], colorClass.middleKey, scaleColors[scaleColors.length - 1]]; |
| 25 | } |
| 26 | } |
| 27 | if (!background) { |
| 28 | background = document.getElementById(`scales_bgColor`).value; |
| 29 | } |
| 30 | if (scaleType && !level) { |
| 31 | let compliancePicker = document.getElementById(`scales_complianceLevel`); |
| 32 | level = compliancePicker.value; |
| 33 | } |
| 34 | |
| 35 | let bgArray = chroma(background).rgb(); |
| 36 | const minimumThreshold = 11; |
| 37 | const WCAGmin = level === 'AA' ? 3 : 4.5; |
| 38 | |
| 39 | let reportWrapper = document.getElementById(`${scaleType}_a11yTable`); |
| 40 | reportWrapper.innerHTML = ' '; |
| 41 | |
| 42 | let headers = ['Compared colors', 'Preview', 'Status', 'Contrast', 'Color difference']; |
| 43 | let rows = []; |
| 44 | |
| 45 | for (let i = 0; i < colors.length; i++) { |
| 46 | let fgArray = chroma(colors[i]).rgb(); |
| 47 | let contrast = Leo.contrast(fgArray, bgArray); |
| 48 | if (contrast < 0) contrast = contrast * -1; |
| 49 | |
| 50 | let deltaE = getDifference(colors[i], background); |
| 51 | let meterPercent = round(deltaE, 2); |
| 52 | |
| 53 | let uiClass = contrast < WCAGmin || deltaE < minimumThreshold ? 'negative' : 'positive'; |
| 54 | let uiStatus = contrast < WCAGmin || deltaE < minimumThreshold ? 'Fail' : 'Pass'; |
| 55 | |
| 56 | let meterClass = deltaE < minimumThreshold ? 'is-negative' : 'is-positive'; |
| 57 | let color1; |
| 58 | if (scaleType === 'sequential') { |
| 59 | color1 = i === 0 ? 'Start color' : 'End color'; |
| 60 | } else { |
| 61 | color1 = i === 0 ? 'Start color' : i === 1 ? 'Middle color' : 'End color'; |
| 62 | } |
| 63 | let color2 = 'Background'; |
| 64 | |
| 65 | let rowItem = [ |
| 66 | `${color1} vs ${color2}`, |
| 67 | `<div class="dualSwatch"> |
| 68 | <div class="swatch" style="background-color: ${colors[i]}"></div> |
| 69 | <div class="swatch" style="background-color: ${background}"></div> |
| 70 | </div>`, |
| 71 | `<span class="spectrum-Badge spectrum-Badge--sizeS spectrum-Badge--${uiClass}">${uiStatus}</span>`, |
| 72 | `<span class="spectrum-Body spectrum-Body--sizeM">${round(contrast, 2)}:1</span>`, |
| 73 | `<div"> |
| 74 | <div class="spectrum-ProgressBar spectrum-ProgressBar--sizeM deltaE-meter ${meterClass}" value="${meterPercent}" role="progressbar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"> |
no test coverage detected