@thednp/color-picker 0.0.2-alpha1 → 0.0.2-alpha4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/js/color-esm.js +94 -105
- package/dist/js/color-esm.min.js +2 -2
- package/dist/js/color-palette-esm.js +105 -119
- package/dist/js/color-palette-esm.min.js +2 -2
- package/dist/js/color-palette.js +105 -119
- package/dist/js/color-palette.min.js +2 -2
- package/dist/js/color-picker-element-esm.js +279 -375
- package/dist/js/color-picker-element-esm.min.js +2 -2
- package/dist/js/color-picker-element.js +279 -375
- package/dist/js/color-picker-element.min.js +2 -2
- package/dist/js/color-picker-esm.js +235 -323
- package/dist/js/color-picker-esm.min.js +2 -2
- package/dist/js/color-picker.js +235 -323
- package/dist/js/color-picker.min.js +2 -2
- package/dist/js/color.js +94 -105
- package/dist/js/color.min.js +2 -2
- package/package.json +7 -4
- package/src/js/color-palette.js +10 -13
- package/src/js/color-picker-element.js +46 -54
- package/src/js/color-picker.js +131 -206
- package/src/js/color.js +93 -106
- package/types/cp.d.ts +31 -29
- package/types/source/types.d.ts +1 -1
package/src/js/color-picker.js
CHANGED
@@ -27,7 +27,6 @@ import keyupEvent from 'shorter-js/src/strings/keyupEvent';
|
|
27
27
|
import resizeEvent from 'shorter-js/src/strings/resizeEvent';
|
28
28
|
import focusoutEvent from 'shorter-js/src/strings/focusoutEvent';
|
29
29
|
|
30
|
-
// import isMobile from 'shorter-js/src/boolean/isMobile';
|
31
30
|
import getDocument from 'shorter-js/src/get/getDocument';
|
32
31
|
import getDocumentElement from 'shorter-js/src/get/getDocumentElement';
|
33
32
|
import getWindow from 'shorter-js/src/get/getWindow';
|
@@ -82,7 +81,7 @@ const colorPickerDefaults = {
|
|
82
81
|
// ==========================
|
83
82
|
|
84
83
|
/** @type {CP.GetInstance<ColorPicker>} */
|
85
|
-
|
84
|
+
const getColorPickerInstance = (element) => getInstance(element, colorPickerString);
|
86
85
|
|
87
86
|
/** @type {CP.InitCallback<ColorPicker>} */
|
88
87
|
const initColorPicker = (element) => new ColorPicker(element);
|
@@ -102,8 +101,6 @@ function toggleEvents(self, action) {
|
|
102
101
|
fn(input, focusinEvent, self.showPicker);
|
103
102
|
fn(pickerToggle, mouseclickEvent, self.togglePicker);
|
104
103
|
|
105
|
-
fn(input, keydownEvent, self.keyToggle);
|
106
|
-
|
107
104
|
if (menuToggle) {
|
108
105
|
fn(menuToggle, mouseclickEvent, self.toggleMenu);
|
109
106
|
}
|
@@ -141,8 +138,7 @@ function toggleEventsOnShown(self, action) {
|
|
141
138
|
fn(doc, pointerEvents.move, self.pointerMove);
|
142
139
|
fn(doc, pointerEvents.up, self.pointerUp);
|
143
140
|
fn(parent, focusoutEvent, self.handleFocusOut);
|
144
|
-
|
145
|
-
fn(win, keyupEvent, self.handleDismiss);
|
141
|
+
fn(doc, keyupEvent, self.handleDismiss);
|
146
142
|
}
|
147
143
|
|
148
144
|
/**
|
@@ -226,7 +222,7 @@ export default class ColorPicker {
|
|
226
222
|
const input = querySelector(target);
|
227
223
|
|
228
224
|
// invalidate
|
229
|
-
if (!input) throw new TypeError(`ColorPicker target ${target} cannot be found.`);
|
225
|
+
if (!input) throw new TypeError(`ColorPicker target "${target}" cannot be found.`);
|
230
226
|
self.input = input;
|
231
227
|
|
232
228
|
const parent = closest(input, colorPickerParentSelector);
|
@@ -273,15 +269,14 @@ export default class ColorPicker {
|
|
273
269
|
});
|
274
270
|
|
275
271
|
// update and expose component labels
|
276
|
-
const
|
277
|
-
|
278
|
-
? JSON.parse(componentLabels) : componentLabels || {};
|
272
|
+
const tempComponentLabels = componentLabels && isValidJSON(componentLabels)
|
273
|
+
? JSON.parse(componentLabels) : componentLabels;
|
279
274
|
|
280
275
|
/** @type {Record<string, string>} */
|
281
|
-
self.componentLabels = ObjectAssign(
|
276
|
+
self.componentLabels = ObjectAssign(colorPickerLabels, tempComponentLabels);
|
282
277
|
|
283
278
|
/** @type {Color} */
|
284
|
-
self.color = new Color('
|
279
|
+
self.color = new Color(input.value || '#fff', format);
|
285
280
|
|
286
281
|
/** @type {CP.ColorFormats} */
|
287
282
|
self.format = format;
|
@@ -290,7 +285,7 @@ export default class ColorPicker {
|
|
290
285
|
if (colorKeywords instanceof Array) {
|
291
286
|
self.colorKeywords = colorKeywords;
|
292
287
|
} else if (typeof colorKeywords === 'string' && colorKeywords.length) {
|
293
|
-
self.colorKeywords = colorKeywords.split(',');
|
288
|
+
self.colorKeywords = colorKeywords.split(',').map((x) => x.trim());
|
294
289
|
}
|
295
290
|
|
296
291
|
// set colour presets
|
@@ -319,7 +314,6 @@ export default class ColorPicker {
|
|
319
314
|
self.handleFocusOut = self.handleFocusOut.bind(self);
|
320
315
|
self.changeHandler = self.changeHandler.bind(self);
|
321
316
|
self.handleDismiss = self.handleDismiss.bind(self);
|
322
|
-
self.keyToggle = self.keyToggle.bind(self);
|
323
317
|
self.handleKnobs = self.handleKnobs.bind(self);
|
324
318
|
|
325
319
|
// generate markup
|
@@ -411,76 +405,83 @@ export default class ColorPicker {
|
|
411
405
|
return inputValue !== '' && new Color(inputValue).isValid;
|
412
406
|
}
|
413
407
|
|
408
|
+
/** Returns the colour appearance, usually the closest colour name for the current value. */
|
409
|
+
get appearance() {
|
410
|
+
const {
|
411
|
+
colorLabels, hsl, hsv, format,
|
412
|
+
} = this;
|
413
|
+
|
414
|
+
const hue = roundPart(hsl.h * 360);
|
415
|
+
const saturationSource = format === 'hsl' ? hsl.s : hsv.s;
|
416
|
+
const saturation = roundPart(saturationSource * 100);
|
417
|
+
const lightness = roundPart(hsl.l * 100);
|
418
|
+
const hsvl = hsv.v * 100;
|
419
|
+
|
420
|
+
let colorName;
|
421
|
+
|
422
|
+
// determine color appearance
|
423
|
+
if (lightness === 100 && saturation === 0) {
|
424
|
+
colorName = colorLabels.white;
|
425
|
+
} else if (lightness === 0) {
|
426
|
+
colorName = colorLabels.black;
|
427
|
+
} else if (saturation === 0) {
|
428
|
+
colorName = colorLabels.grey;
|
429
|
+
} else if (hue < 15 || hue >= 345) {
|
430
|
+
colorName = colorLabels.red;
|
431
|
+
} else if (hue >= 15 && hue < 45) {
|
432
|
+
colorName = hsvl > 80 && saturation > 80 ? colorLabels.orange : colorLabels.brown;
|
433
|
+
} else if (hue >= 45 && hue < 75) {
|
434
|
+
const isGold = hue > 46 && hue < 54 && hsvl < 80 && saturation > 90;
|
435
|
+
const isOlive = hue >= 54 && hue < 75 && hsvl < 80;
|
436
|
+
colorName = isGold ? colorLabels.gold : colorLabels.yellow;
|
437
|
+
colorName = isOlive ? colorLabels.olive : colorName;
|
438
|
+
} else if (hue >= 75 && hue < 155) {
|
439
|
+
colorName = hsvl < 68 ? colorLabels.green : colorLabels.lime;
|
440
|
+
} else if (hue >= 155 && hue < 175) {
|
441
|
+
colorName = colorLabels.teal;
|
442
|
+
} else if (hue >= 175 && hue < 195) {
|
443
|
+
colorName = colorLabels.cyan;
|
444
|
+
} else if (hue >= 195 && hue < 255) {
|
445
|
+
colorName = colorLabels.blue;
|
446
|
+
} else if (hue >= 255 && hue < 270) {
|
447
|
+
colorName = colorLabels.violet;
|
448
|
+
} else if (hue >= 270 && hue < 295) {
|
449
|
+
colorName = colorLabels.magenta;
|
450
|
+
} else if (hue >= 295 && hue < 345) {
|
451
|
+
colorName = colorLabels.pink;
|
452
|
+
}
|
453
|
+
return colorName;
|
454
|
+
}
|
455
|
+
|
414
456
|
/** Updates `ColorPicker` visuals. */
|
415
457
|
updateVisuals() {
|
416
458
|
const self = this;
|
417
459
|
const {
|
418
|
-
|
460
|
+
controlPositions, visuals,
|
419
461
|
} = self;
|
420
462
|
const [v1, v2, v3] = visuals;
|
421
|
-
const {
|
422
|
-
const hue =
|
423
|
-
|
424
|
-
: controlPositions.c2y / offsetHeight;
|
425
|
-
// @ts-ignore - `hslToRgb` is assigned to `Color` as static method
|
426
|
-
const { r, g, b } = Color.hslToRgb(hue, 1, 0.5);
|
463
|
+
const { offsetHeight } = v1;
|
464
|
+
const hue = controlPositions.c2y / offsetHeight;
|
465
|
+
const { r, g, b } = new Color({ h: hue, s: 1, l: 0.5 }).toRgb();
|
427
466
|
const whiteGrad = 'linear-gradient(rgb(255,255,255) 0%, rgb(255,255,255) 100%)';
|
428
467
|
const alpha = 1 - controlPositions.c3y / offsetHeight;
|
429
468
|
const roundA = roundPart((alpha * 100)) / 100;
|
430
469
|
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
setElementStyle(v2, { background: hueGradient });
|
446
|
-
} else {
|
447
|
-
const saturation = roundPart((controlPositions.c2y / offsetHeight) * 100);
|
448
|
-
const fill0 = new Color({
|
449
|
-
r: 255, g: 0, b: 0, a: alpha,
|
450
|
-
}).saturate(-saturation).toRgbString();
|
451
|
-
const fill1 = new Color({
|
452
|
-
r: 255, g: 255, b: 0, a: alpha,
|
453
|
-
}).saturate(-saturation).toRgbString();
|
454
|
-
const fill2 = new Color({
|
455
|
-
r: 0, g: 255, b: 0, a: alpha,
|
456
|
-
}).saturate(-saturation).toRgbString();
|
457
|
-
const fill3 = new Color({
|
458
|
-
r: 0, g: 255, b: 255, a: alpha,
|
459
|
-
}).saturate(-saturation).toRgbString();
|
460
|
-
const fill4 = new Color({
|
461
|
-
r: 0, g: 0, b: 255, a: alpha,
|
462
|
-
}).saturate(-saturation).toRgbString();
|
463
|
-
const fill5 = new Color({
|
464
|
-
r: 255, g: 0, b: 255, a: alpha,
|
465
|
-
}).saturate(-saturation).toRgbString();
|
466
|
-
const fill6 = new Color({
|
467
|
-
r: 255, g: 0, b: 0, a: alpha,
|
468
|
-
}).saturate(-saturation).toRgbString();
|
469
|
-
const fillGradient = `linear-gradient(to right,
|
470
|
-
${fill0} 0%, ${fill1} 16.67%, ${fill2} 33.33%, ${fill3} 50%,
|
471
|
-
${fill4} 66.67%, ${fill5} 83.33%, ${fill6} 100%)`;
|
472
|
-
const lightGrad = `linear-gradient(rgba(255,255,255,${roundA}) 0%, rgba(255,255,255,0) 50%),
|
473
|
-
linear-gradient(rgba(0,0,0,0) 50%, rgba(0,0,0,${roundA}) 100%)`;
|
474
|
-
|
475
|
-
setElementStyle(v1, { background: `${lightGrad},${fillGradient},${whiteGrad}` });
|
476
|
-
const {
|
477
|
-
r: gr, g: gg, b: gb,
|
478
|
-
} = new Color({ r, g, b }).greyscale().toRgb();
|
470
|
+
const fill = new Color({
|
471
|
+
h: hue, s: 1, l: 0.5, a: alpha,
|
472
|
+
}).toRgbString();
|
473
|
+
const hueGradient = `linear-gradient(
|
474
|
+
rgb(255,0,0) 0%, rgb(255,255,0) 16.67%,
|
475
|
+
rgb(0,255,0) 33.33%, rgb(0,255,255) 50%,
|
476
|
+
rgb(0,0,255) 66.67%, rgb(255,0,255) 83.33%,
|
477
|
+
rgb(255,0,0) 100%)`;
|
478
|
+
setElementStyle(v1, {
|
479
|
+
background: `linear-gradient(rgba(0,0,0,0) 0%, rgba(0,0,0,${roundA}) 100%),
|
480
|
+
linear-gradient(to right, rgba(255,255,255,${roundA}) 0%, ${fill} 100%),
|
481
|
+
${whiteGrad}`,
|
482
|
+
});
|
483
|
+
setElementStyle(v2, { background: hueGradient });
|
479
484
|
|
480
|
-
setElementStyle(v2, {
|
481
|
-
background: `linear-gradient(rgb(${r},${g},${b}) 0%, rgb(${gr},${gg},${gb}) 100%)`,
|
482
|
-
});
|
483
|
-
}
|
484
485
|
setElementStyle(v3, {
|
485
486
|
background: `linear-gradient(rgba(${r},${g},${b},1) 0%,rgba(${r},${g},${b},0) 100%)`,
|
486
487
|
});
|
@@ -630,13 +631,13 @@ export default class ColorPicker {
|
|
630
631
|
const [v1, v2, v3] = visuals;
|
631
632
|
const [c1, c2, c3] = controlKnobs;
|
632
633
|
/** @type {HTMLElement} */
|
633
|
-
const visual =
|
634
|
-
? target : querySelector('.visual-control', target.parentElement);
|
634
|
+
const visual = controlKnobs.includes(target) ? target.previousElementSibling : target;
|
635
635
|
const visualRect = getBoundingClientRect(visual);
|
636
|
+
const html = getDocumentElement(v1);
|
636
637
|
const X = type === 'touchstart' ? touches[0].pageX : pageX;
|
637
638
|
const Y = type === 'touchstart' ? touches[0].pageY : pageY;
|
638
|
-
const offsetX = X -
|
639
|
-
const offsetY = Y -
|
639
|
+
const offsetX = X - html.scrollLeft - visualRect.left;
|
640
|
+
const offsetY = Y - html.scrollTop - visualRect.top;
|
640
641
|
|
641
642
|
if (target === v1 || target === c1) {
|
642
643
|
self.dragElement = visual;
|
@@ -696,10 +697,11 @@ export default class ColorPicker {
|
|
696
697
|
if (!dragElement) return;
|
697
698
|
|
698
699
|
const controlRect = getBoundingClientRect(dragElement);
|
699
|
-
const
|
700
|
-
const
|
701
|
-
const
|
702
|
-
const
|
700
|
+
const win = getDocumentElement(v1);
|
701
|
+
const X = type === touchmoveEvent ? touches[0].pageX : pageX;
|
702
|
+
const Y = type === touchmoveEvent ? touches[0].pageY : pageY;
|
703
|
+
const offsetX = X - win.scrollLeft - controlRect.left;
|
704
|
+
const offsetY = Y - win.scrollTop - controlRect.top;
|
703
705
|
|
704
706
|
if (dragElement === v1) {
|
705
707
|
self.changeControl1(offsetX, offsetY);
|
@@ -726,19 +728,19 @@ export default class ColorPicker {
|
|
726
728
|
if (![keyArrowUp, keyArrowDown, keyArrowLeft, keyArrowRight].includes(code)) return;
|
727
729
|
e.preventDefault();
|
728
730
|
|
729
|
-
const {
|
731
|
+
const { controlKnobs, visuals } = self;
|
730
732
|
const { offsetWidth, offsetHeight } = visuals[0];
|
731
733
|
const [c1, c2, c3] = controlKnobs;
|
732
734
|
const { activeElement } = getDocument(c1);
|
733
735
|
const currentKnob = controlKnobs.find((x) => x === activeElement);
|
734
|
-
const yRatio = offsetHeight /
|
736
|
+
const yRatio = offsetHeight / 360;
|
735
737
|
|
736
738
|
if (currentKnob) {
|
737
739
|
let offsetX = 0;
|
738
740
|
let offsetY = 0;
|
739
741
|
|
740
742
|
if (target === c1) {
|
741
|
-
const xRatio = offsetWidth /
|
743
|
+
const xRatio = offsetWidth / 100;
|
742
744
|
|
743
745
|
if ([keyArrowLeft, keyArrowRight].includes(code)) {
|
744
746
|
self.controlPositions.c1x += code === keyArrowRight ? xRatio : -xRatio;
|
@@ -788,7 +790,7 @@ export default class ColorPicker {
|
|
788
790
|
if (activeElement === input || (activeElement && inputs.includes(activeElement))) {
|
789
791
|
if (activeElement === input) {
|
790
792
|
if (isNonColorValue) {
|
791
|
-
colorSource = '
|
793
|
+
colorSource = currentValue === 'transparent' ? 'rgba(0,0,0,0)' : 'rgb(0,0,0)';
|
792
794
|
} else {
|
793
795
|
colorSource = currentValue;
|
794
796
|
}
|
@@ -839,9 +841,7 @@ export default class ColorPicker {
|
|
839
841
|
changeControl1(X, Y) {
|
840
842
|
const self = this;
|
841
843
|
let [offsetX, offsetY] = [0, 0];
|
842
|
-
const {
|
843
|
-
format, controlPositions, visuals,
|
844
|
-
} = self;
|
844
|
+
const { controlPositions, visuals } = self;
|
845
845
|
const { offsetHeight, offsetWidth } = visuals[0];
|
846
846
|
|
847
847
|
if (X > offsetWidth) offsetX = offsetWidth;
|
@@ -850,29 +850,19 @@ export default class ColorPicker {
|
|
850
850
|
if (Y > offsetHeight) offsetY = offsetHeight;
|
851
851
|
else if (Y >= 0) offsetY = Y;
|
852
852
|
|
853
|
-
const hue =
|
854
|
-
? offsetX / offsetWidth
|
855
|
-
: controlPositions.c2y / offsetHeight;
|
853
|
+
const hue = controlPositions.c2y / offsetHeight;
|
856
854
|
|
857
|
-
const saturation =
|
858
|
-
? 1 - controlPositions.c2y / offsetHeight
|
859
|
-
: offsetX / offsetWidth;
|
855
|
+
const saturation = offsetX / offsetWidth;
|
860
856
|
|
861
857
|
const lightness = 1 - offsetY / offsetHeight;
|
862
858
|
const alpha = 1 - controlPositions.c3y / offsetHeight;
|
863
859
|
|
864
|
-
const colorObject = format === 'hsl'
|
865
|
-
? {
|
866
|
-
h: hue, s: saturation, l: lightness, a: alpha,
|
867
|
-
}
|
868
|
-
: {
|
869
|
-
h: hue, s: saturation, v: lightness, a: alpha,
|
870
|
-
};
|
871
|
-
|
872
860
|
// new color
|
873
861
|
const {
|
874
862
|
r, g, b, a,
|
875
|
-
} = new Color(
|
863
|
+
} = new Color({
|
864
|
+
h: hue, s: saturation, v: lightness, a: alpha,
|
865
|
+
});
|
876
866
|
|
877
867
|
ObjectAssign(self.color, {
|
878
868
|
r, g, b, a,
|
@@ -899,7 +889,7 @@ export default class ColorPicker {
|
|
899
889
|
changeControl2(Y) {
|
900
890
|
const self = this;
|
901
891
|
const {
|
902
|
-
|
892
|
+
controlPositions, visuals,
|
903
893
|
} = self;
|
904
894
|
const { offsetHeight, offsetWidth } = visuals[0];
|
905
895
|
|
@@ -908,26 +898,17 @@ export default class ColorPicker {
|
|
908
898
|
if (Y > offsetHeight) offsetY = offsetHeight;
|
909
899
|
else if (Y >= 0) offsetY = Y;
|
910
900
|
|
911
|
-
const hue =
|
912
|
-
|
913
|
-
: offsetY / offsetHeight;
|
914
|
-
const saturation = format === 'hsl'
|
915
|
-
? 1 - offsetY / offsetHeight
|
916
|
-
: controlPositions.c1x / offsetWidth;
|
901
|
+
const hue = offsetY / offsetHeight;
|
902
|
+
const saturation = controlPositions.c1x / offsetWidth;
|
917
903
|
const lightness = 1 - controlPositions.c1y / offsetHeight;
|
918
904
|
const alpha = 1 - controlPositions.c3y / offsetHeight;
|
919
|
-
const colorObject = format === 'hsl'
|
920
|
-
? {
|
921
|
-
h: hue, s: saturation, l: lightness, a: alpha,
|
922
|
-
}
|
923
|
-
: {
|
924
|
-
h: hue, s: saturation, v: lightness, a: alpha,
|
925
|
-
};
|
926
905
|
|
927
906
|
// new color
|
928
907
|
const {
|
929
908
|
r, g, b, a,
|
930
|
-
} = new Color(
|
909
|
+
} = new Color({
|
910
|
+
h: hue, s: saturation, v: lightness, a: alpha,
|
911
|
+
});
|
931
912
|
|
932
913
|
ObjectAssign(self.color, {
|
933
914
|
r, g, b, a,
|
@@ -1014,18 +995,18 @@ export default class ColorPicker {
|
|
1014
995
|
setControlPositions() {
|
1015
996
|
const self = this;
|
1016
997
|
const {
|
1017
|
-
|
998
|
+
visuals, color, hsv,
|
1018
999
|
} = self;
|
1019
1000
|
const { offsetHeight, offsetWidth } = visuals[0];
|
1020
1001
|
const alpha = color.a;
|
1021
|
-
const hue =
|
1002
|
+
const hue = hsv.h;
|
1022
1003
|
|
1023
|
-
const saturation =
|
1024
|
-
const lightness =
|
1004
|
+
const saturation = hsv.s;
|
1005
|
+
const lightness = hsv.v;
|
1025
1006
|
|
1026
|
-
self.controlPositions.c1x =
|
1007
|
+
self.controlPositions.c1x = saturation * offsetWidth;
|
1027
1008
|
self.controlPositions.c1y = (1 - lightness) * offsetHeight;
|
1028
|
-
self.controlPositions.c2y =
|
1009
|
+
self.controlPositions.c2y = hue * offsetHeight;
|
1029
1010
|
self.controlPositions.c3y = (1 - alpha) * offsetHeight;
|
1030
1011
|
}
|
1031
1012
|
|
@@ -1033,78 +1014,40 @@ export default class ColorPicker {
|
|
1033
1014
|
updateAppearance() {
|
1034
1015
|
const self = this;
|
1035
1016
|
const {
|
1036
|
-
componentLabels,
|
1037
|
-
|
1017
|
+
componentLabels, color, parent,
|
1018
|
+
hsv, hex, format, controlKnobs,
|
1038
1019
|
} = self;
|
1039
1020
|
const {
|
1040
1021
|
appearanceLabel, hexLabel, valueLabel,
|
1041
1022
|
} = componentLabels;
|
1042
|
-
|
1023
|
+
let { r, g, b } = color.toRgb();
|
1043
1024
|
const [knob1, knob2, knob3] = controlKnobs;
|
1044
|
-
const hue = roundPart(
|
1025
|
+
const hue = roundPart(hsv.h * 360);
|
1045
1026
|
const alpha = color.a;
|
1046
|
-
const
|
1047
|
-
const
|
1048
|
-
const
|
1049
|
-
const hsvl = hsv.v * 100;
|
1050
|
-
let colorName;
|
1051
|
-
|
1052
|
-
// determine color appearance
|
1053
|
-
if (lightness === 100 && saturation === 0) {
|
1054
|
-
colorName = colorLabels.white;
|
1055
|
-
} else if (lightness === 0) {
|
1056
|
-
colorName = colorLabels.black;
|
1057
|
-
} else if (saturation === 0) {
|
1058
|
-
colorName = colorLabels.grey;
|
1059
|
-
} else if (hue < 15 || hue >= 345) {
|
1060
|
-
colorName = colorLabels.red;
|
1061
|
-
} else if (hue >= 15 && hue < 45) {
|
1062
|
-
colorName = hsvl > 80 && saturation > 80 ? colorLabels.orange : colorLabels.brown;
|
1063
|
-
} else if (hue >= 45 && hue < 75) {
|
1064
|
-
const isGold = hue > 46 && hue < 54 && hsvl < 80 && saturation > 90;
|
1065
|
-
const isOlive = hue >= 54 && hue < 75 && hsvl < 80;
|
1066
|
-
colorName = isGold ? colorLabels.gold : colorLabels.yellow;
|
1067
|
-
colorName = isOlive ? colorLabels.olive : colorName;
|
1068
|
-
} else if (hue >= 75 && hue < 155) {
|
1069
|
-
colorName = hsvl < 68 ? colorLabels.green : colorLabels.lime;
|
1070
|
-
} else if (hue >= 155 && hue < 175) {
|
1071
|
-
colorName = colorLabels.teal;
|
1072
|
-
} else if (hue >= 175 && hue < 195) {
|
1073
|
-
colorName = colorLabels.cyan;
|
1074
|
-
} else if (hue >= 195 && hue < 255) {
|
1075
|
-
colorName = colorLabels.blue;
|
1076
|
-
} else if (hue >= 255 && hue < 270) {
|
1077
|
-
colorName = colorLabels.violet;
|
1078
|
-
} else if (hue >= 270 && hue < 295) {
|
1079
|
-
colorName = colorLabels.magenta;
|
1080
|
-
} else if (hue >= 295 && hue < 345) {
|
1081
|
-
colorName = colorLabels.pink;
|
1082
|
-
}
|
1027
|
+
const saturation = roundPart(hsv.s * 100);
|
1028
|
+
const lightness = roundPart(hsv.v * 100);
|
1029
|
+
const colorName = self.appearance;
|
1083
1030
|
|
1084
1031
|
let colorLabel = `${hexLabel} ${hex.split('').join(' ')}`;
|
1085
1032
|
|
1086
|
-
if (format === '
|
1087
|
-
colorLabel = `HSL: ${hue}°, ${saturation}%, ${lightness}%`;
|
1088
|
-
setAttribute(knob1, ariaDescription, `${valueLabel}: ${colorLabel}. ${appearanceLabel}: ${colorName}.`);
|
1089
|
-
setAttribute(knob1, ariaValueText, `${hue}° & ${lightness}%`);
|
1090
|
-
setAttribute(knob1, ariaValueNow, `${hue}`);
|
1091
|
-
setAttribute(knob2, ariaValueText, `${saturation}%`);
|
1092
|
-
setAttribute(knob2, ariaValueNow, `${saturation}`);
|
1093
|
-
} else if (format === 'hwb') {
|
1033
|
+
if (format === 'hwb') {
|
1094
1034
|
const { hwb } = self;
|
1095
1035
|
const whiteness = roundPart(hwb.w * 100);
|
1096
1036
|
const blackness = roundPart(hwb.b * 100);
|
1097
1037
|
colorLabel = `HWB: ${hue}°, ${whiteness}%, ${blackness}%`;
|
1098
|
-
setAttribute(knob1, ariaDescription, `${valueLabel}: ${colorLabel}. ${appearanceLabel}: ${colorName}.`);
|
1099
1038
|
setAttribute(knob1, ariaValueText, `${whiteness}% & ${blackness}%`);
|
1100
1039
|
setAttribute(knob1, ariaValueNow, `${whiteness}`);
|
1040
|
+
setAttribute(knob2, ariaDescription, `${valueLabel}: ${colorLabel}. ${appearanceLabel}: ${colorName}.`);
|
1101
1041
|
setAttribute(knob2, ariaValueText, `${hue}%`);
|
1102
1042
|
setAttribute(knob2, ariaValueNow, `${hue}`);
|
1103
1043
|
} else {
|
1044
|
+
[r, g, b] = [r, g, b].map(roundPart);
|
1045
|
+
colorLabel = format === 'hsl' ? `HSL: ${hue}°, ${saturation}%, ${lightness}%` : colorLabel;
|
1104
1046
|
colorLabel = format === 'rgb' ? `RGB: ${r}, ${g}, ${b}` : colorLabel;
|
1105
|
-
|
1047
|
+
|
1106
1048
|
setAttribute(knob1, ariaValueText, `${lightness}% & ${saturation}%`);
|
1107
1049
|
setAttribute(knob1, ariaValueNow, `${lightness}`);
|
1050
|
+
setAttribute(knob2, ariaDescription, `${valueLabel}: ${colorLabel}. ${appearanceLabel}: ${colorName}.`);
|
1108
1051
|
setAttribute(knob2, ariaValueText, `${hue}°`);
|
1109
1052
|
setAttribute(knob2, ariaValueNow, `${hue}`);
|
1110
1053
|
}
|
@@ -1199,37 +1142,13 @@ export default class ColorPicker {
|
|
1199
1142
|
}
|
1200
1143
|
}
|
1201
1144
|
|
1202
|
-
/**
|
1203
|
-
* The `Space` & `Enter` keys specific event listener.
|
1204
|
-
* Toggle visibility of the `ColorPicker` / the presets menu, showing one will hide the other.
|
1205
|
-
* @param {KeyboardEvent} e
|
1206
|
-
* @this {ColorPicker}
|
1207
|
-
*/
|
1208
|
-
keyToggle(e) {
|
1209
|
-
const self = this;
|
1210
|
-
const { menuToggle } = self;
|
1211
|
-
const { activeElement } = getDocument(menuToggle);
|
1212
|
-
const { code } = e;
|
1213
|
-
|
1214
|
-
if ([keyEnter, keySpace].includes(code)) {
|
1215
|
-
if ((menuToggle && activeElement === menuToggle) || !activeElement) {
|
1216
|
-
e.preventDefault();
|
1217
|
-
if (!activeElement) {
|
1218
|
-
self.togglePicker(e);
|
1219
|
-
} else {
|
1220
|
-
self.toggleMenu();
|
1221
|
-
}
|
1222
|
-
}
|
1223
|
-
}
|
1224
|
-
}
|
1225
|
-
|
1226
1145
|
/**
|
1227
1146
|
* Toggle the `ColorPicker` dropdown visibility.
|
1228
|
-
* @param {Event} e
|
1147
|
+
* @param {Event=} e
|
1229
1148
|
* @this {ColorPicker}
|
1230
1149
|
*/
|
1231
1150
|
togglePicker(e) {
|
1232
|
-
e.preventDefault();
|
1151
|
+
if (e) e.preventDefault();
|
1233
1152
|
const self = this;
|
1234
1153
|
const { colorPicker } = self;
|
1235
1154
|
|
@@ -1250,8 +1169,13 @@ export default class ColorPicker {
|
|
1250
1169
|
}
|
1251
1170
|
}
|
1252
1171
|
|
1253
|
-
/**
|
1254
|
-
|
1172
|
+
/**
|
1173
|
+
* Toggles the visibility of the `ColorPicker` presets menu.
|
1174
|
+
* @param {Event=} e
|
1175
|
+
* @this {ColorPicker}
|
1176
|
+
*/
|
1177
|
+
toggleMenu(e) {
|
1178
|
+
if (e) e.preventDefault();
|
1255
1179
|
const self = this;
|
1256
1180
|
const { colorMenu } = self;
|
1257
1181
|
|
@@ -1277,6 +1201,10 @@ export default class ColorPicker {
|
|
1277
1201
|
const relatedBtn = openPicker ? pickerToggle : menuToggle;
|
1278
1202
|
const animationDuration = openDropdown && getElementTransitionDuration(openDropdown);
|
1279
1203
|
|
1204
|
+
// if (!self.isValid) {
|
1205
|
+
self.value = self.color.toString(true);
|
1206
|
+
// }
|
1207
|
+
|
1280
1208
|
if (openDropdown) {
|
1281
1209
|
removeClass(openDropdown, 'show');
|
1282
1210
|
setAttribute(relatedBtn, ariaExpanded, 'false');
|
@@ -1290,9 +1218,6 @@ export default class ColorPicker {
|
|
1290
1218
|
}, animationDuration);
|
1291
1219
|
}
|
1292
1220
|
|
1293
|
-
if (!self.isValid) {
|
1294
|
-
self.value = self.color.toString();
|
1295
|
-
}
|
1296
1221
|
if (!focusPrevented) {
|
1297
1222
|
focus(pickerToggle);
|
1298
1223
|
}
|