Skip to content

Commit 210908c

Browse files
NateBaldwinDesignNathan Baldwin
and
Nathan Baldwin
authored
Bulk contrast feature in conversion dialog (#183)
* added initial form fill for contrast. WCAG 2 formula works * added apca to bulk contrast Co-authored-by: Nathan Baldwin <nbaldwin@macos-tlj9t6kg6n.hsd1.ut.comcast.net>
1 parent d7be62c commit 210908c

File tree

2 files changed

+55
-5
lines changed

2 files changed

+55
-5
lines changed

packages/ui/src/js/bulkConvertDialog.js

+16-5
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ OF ANY KIND, either express or implied. See the License for the specific languag
99
governing permissions and limitations under the License.
1010
*/
1111

12-
import d3 from './d3';
12+
import { APCAcontrast, sRGBtoY } from "apca-w3";
1313
import {
1414
round
1515
} from './utils';
16+
import {contrast} from '@adobe/leonardo-contrast-colors';
1617
import { saveAs } from 'file-saver';
1718

1819
const simpleColorConverter = require('simple-color-converter');
@@ -38,6 +39,7 @@ function cancelBulkConvert() {
3839
}
3940

4041
function bulkItemConvertColorInput(e) {
42+
let background = document.getElementById('bulkConvertBackground').value;
4143
let bulkInputs = document.getElementById('bulkConvertColors');
4244
let bulkValues = bulkInputs.value.replace(/\r\n/g,"\n").replace(/[,\/]/g,"\n").replace(" ", "").replace(/['\/]/g, "").replace(/["\/]/g, "").replace(" ", "").split("\n");
4345
bulkValues = bulkValues.map((value) => {return value.replace(" ", "")});
@@ -64,11 +66,9 @@ function bulkItemConvertColorInput(e) {
6466

6567
let data = [];
6668
colors.map((c) => {
67-
data.push(createColorJson(c, opts))
69+
data.push(createColorJson(c, opts, background))
6870
})
6971

70-
// console.log(data)
71-
7272
const replacer = (key, value) => value === null ? '' : value // specify how you want to handle null values here
7373
const header = Object.keys(data[0])
7474
const csv = [
@@ -93,7 +93,7 @@ function bulkItemConvertColorInput(e) {
9393
bulkInputs.value = " ";
9494
}
9595

96-
function createColorJson(value, colorSpaces) {
96+
function createColorJson(value, colorSpaces, background) {
9797
if(!chroma.valid(value)) {
9898
// Should return an error
9999
}
@@ -119,6 +119,13 @@ function createColorJson(value, colorSpaces) {
119119
if(colorSpaces[i] === 'CMYK') colorChannels = color.cmyk().map((c) => {return c * 100});
120120
if(colorSpaces[i] === 'XYZ') colorChannels = Object.values(new simpleColorConverter({ rgb: {r: color.rgb()[0], g: color.rgb()[1], b: color.rgb()[2] }, to: 'xyz' }).color);
121121
if(colorSpaces[i] === 'Pantone') colorChannels = new simpleColorConverter({ rgb: {r: color.rgb()[0], g: color.rgb()[1], b: color.rgb()[2] }, to: 'pantone' }).color;
122+
if(colorSpaces[i] === 'wcag2') colorChannels = round(contrast(color.rgb(), chroma(background).rgb(), 'wcag2'), 2);
123+
if(colorSpaces[i] === 'wcag3') {
124+
const baseLightness = chroma(background).hsluv()[2];
125+
const baseV = round(baseLightness / 100, 2);
126+
let base = chroma(background).rgb();
127+
colorChannels = round( (baseV < 0.5) ? APCAcontrast( sRGBtoY( color.rgb() ), sRGBtoY( base ) ) * -1 : APCAcontrast( sRGBtoY( color.rgb() ), sRGBtoY( base ) ), 2);
128+
}
122129

123130
if(colorSpaces[i] === 'HEX') colorChannelLabels = ['Hex'];
124131
if(colorSpaces[i] === 'RGB') colorChannelLabels = ['rgb (R)', 'rgb (G)', 'rgb (B)'];
@@ -135,6 +142,10 @@ function createColorJson(value, colorSpaces) {
135142
if(colorSpaces[i] === 'XYZ') colorChannelLabels = ['xyz (X)', 'xyz (Y)', 'xyz (Z)'];
136143
if(colorSpaces[i] === 'Pantone') colorChannelLabels = ['Pantone'];
137144

145+
if(colorSpaces[i] === 'wcag2') colorChannelLabels = [`Rel Lum vs ${background}`]
146+
if(colorSpaces[i] === 'wcag3') colorChannelLabels = [`APCA vs ${background}`]
147+
148+
138149
if(Array.isArray(colorChannels)) {
139150
colorChannels = colorChannels.map((c) => {return round(c, 2)})
140151
} else {

packages/ui/src/views/dialog_bulkColorConverter.html

+39
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,45 @@ <h2 class="spectrum-Dialog-heading">Convert bulk</h2>
161161
</div>
162162
</div>
163163
</div>
164+
165+
<div class="spectrum-Form spectrum-Form--labelsAbove">
166+
<div class="spectrum-Form-item">
167+
<label class="spectrum-FieldLabel spectrum-FieldLabel--sizeM spectrum-Form-itemLabel" for="spectrum-textinput-instance">Contrast</label>
168+
<div class="spectrum-Form-itemField">
169+
<div class="spectrum-FieldGroup">
170+
<label class="spectrum-Checkbox spectrum-Checkbox--sizeM spectrum-FieldGroup-item">
171+
<input type="checkbox" class="spectrum-Checkbox-input convertBulkColorspace" id="checkboxConvert-wcag2">
172+
<span class="spectrum-Checkbox-box">
173+
<svg class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Checkbox-checkmark" focusable="false" aria-hidden="true">
174+
<use xlink:href="#spectrum-css-icon-Checkmark100" />
175+
</svg>
176+
</span>
177+
<span class="spectrum-Checkbox-label">Relative luminance</span>
178+
</label>
179+
</div>
180+
</div>
181+
<div class="spectrum-Form-itemField">
182+
<div class="spectrum-FieldGroup">
183+
<label class="spectrum-Checkbox spectrum-Checkbox--sizeM spectrum-FieldGroup-item">
184+
<input type="checkbox" class="spectrum-Checkbox-input convertBulkColorspace" id="checkboxConvert-wcag3">
185+
<span class="spectrum-Checkbox-box">
186+
<svg class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Checkbox-checkmark" focusable="false" aria-hidden="true">
187+
<use xlink:href="#spectrum-css-icon-Checkmark100" />
188+
</svg>
189+
</span>
190+
<span class="spectrum-Checkbox-label">APCA</span>
191+
</label>
192+
</div>
193+
</div>
194+
<div class="spectrum-Form-itemField">
195+
<div class="spectrum-Form-item spectrum-Form-item--row">
196+
<label class="spectrum-FieldLabel spectrum-FieldLabel--left spectrum-Fieldlabel--sizeM ">Background color</label>
197+
<input type="color" id="bulkConvertBackground" class="keyColor-Item keyColor-Item--standalone"/>
198+
</div>
199+
</div>
200+
</div>
201+
202+
</div>
164203
</section>
165204
<div class="spectrum-ButtonGroup spectrum-Dialog-buttonGroup spectrum-Dialog-buttonGroup--noFooter">
166205
<button class="spectrum-Button spectrum-Button--sizeM spectrum-Button--secondary spectrum-ButtonGroup-item" onclick="cancelBulkConvert()">Cancel</button>

0 commit comments

Comments
 (0)