@thednp/color-picker 0.0.2-alpha5 → 1.0.1
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 +21 -19
- package/dist/css/color-picker.css +82 -46
- package/dist/css/color-picker.min.css +2 -2
- package/dist/css/color-picker.rtl.css +82 -46
- package/dist/css/color-picker.rtl.min.css +2 -2
- package/dist/js/color-esm.js +2 -5
- package/dist/js/color-esm.min.js +1 -1
- package/dist/js/color-palette-esm.js +2 -5
- package/dist/js/color-palette-esm.min.js +1 -1
- package/dist/js/color-palette.js +2 -5
- package/dist/js/color-palette.min.js +1 -1
- package/dist/js/color-picker-element-esm.js +184 -189
- package/dist/js/color-picker-element-esm.min.js +2 -2
- package/dist/js/color-picker-element.js +184 -189
- package/dist/js/color-picker-element.min.js +2 -2
- package/dist/js/color-picker-esm.js +77 -134
- package/dist/js/color-picker-esm.min.js +2 -2
- package/dist/js/color-picker.js +77 -134
- package/dist/js/color-picker.min.js +2 -2
- package/dist/js/color.js +2 -5
- package/dist/js/color.min.js +1 -1
- package/package.json +20 -19
- package/src/js/color-picker-element.js +45 -37
- package/src/js/color-picker.js +46 -60
- package/src/js/color.js +1 -4
- package/src/js/index.js +5 -0
- package/src/js/util/getColorMenu.js +7 -8
- package/src/js/util/setMarkup.js +4 -7
- package/src/js/util/toggleCEAttr.js +70 -0
- package/src/js/util/version.js +0 -1
- package/src/js/version.js +0 -1
- package/src/scss/_variables.scss +7 -0
- package/src/scss/color-picker.scss +86 -45
- package/types/cp.d.ts +31 -17
- package/types/index.d.ts +0 -4
- package/types/source/source.ts +0 -1
- package/types/source/types.d.ts +8 -6
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* ColorPicker
|
2
|
+
* ColorPicker v1.0.1 (http://thednp.github.io/color-picker)
|
3
3
|
* Copyright 2022 © thednp
|
4
4
|
* Licensed under MIT (https://github.com/thednp/color-picker/blob/master/LICENSE)
|
5
5
|
*/
|
@@ -9,27 +9,26 @@ const EventRegistry = {};
|
|
9
9
|
/**
|
10
10
|
* The global event listener.
|
11
11
|
*
|
12
|
-
* @
|
13
|
-
* @
|
14
|
-
* @returns {void}
|
12
|
+
* @type {EventListener}
|
13
|
+
* @this {EventTarget}
|
15
14
|
*/
|
16
15
|
function globalListener(e) {
|
17
16
|
const that = this;
|
18
17
|
const { type } = e;
|
19
|
-
const oneEvMap = EventRegistry[type] ? [...EventRegistry[type]] : [];
|
20
18
|
|
21
|
-
|
19
|
+
[...EventRegistry[type]].forEach((elementsMap) => {
|
22
20
|
const [element, listenersMap] = elementsMap;
|
23
|
-
|
24
|
-
|
21
|
+
/* istanbul ignore else */
|
22
|
+
if (element === that) {
|
23
|
+
[...listenersMap].forEach((listenerMap) => {
|
25
24
|
const [listener, options] = listenerMap;
|
26
25
|
listener.apply(element, [e]);
|
27
26
|
|
28
27
|
if (options && options.once) {
|
29
28
|
removeListener(element, type, listener, options);
|
30
29
|
}
|
31
|
-
}
|
32
|
-
}
|
30
|
+
});
|
31
|
+
}
|
33
32
|
});
|
34
33
|
}
|
35
34
|
|
@@ -37,10 +36,7 @@ function globalListener(e) {
|
|
37
36
|
* Register a new listener with its options and attach the `globalListener`
|
38
37
|
* to the target if this is the first listener.
|
39
38
|
*
|
40
|
-
* @
|
41
|
-
* @param {string} eventType
|
42
|
-
* @param {EventListenerObject['handleEvent']} listener
|
43
|
-
* @param {AddEventListenerOptions=} options
|
39
|
+
* @type {Listener.ListenerAction<EventTarget>}
|
44
40
|
*/
|
45
41
|
const addListener = (element, eventType, listener, options) => {
|
46
42
|
// get element listeners first
|
@@ -58,9 +54,7 @@ const addListener = (element, eventType, listener, options) => {
|
|
58
54
|
const { size } = oneElementMap;
|
59
55
|
|
60
56
|
// register listener with its options
|
61
|
-
|
62
|
-
oneElementMap.set(listener, options);
|
63
|
-
}
|
57
|
+
oneElementMap.set(listener, options);
|
64
58
|
|
65
59
|
// add listener last
|
66
60
|
if (!size) {
|
@@ -72,10 +66,7 @@ const addListener = (element, eventType, listener, options) => {
|
|
72
66
|
* Remove a listener from registry and detach the `globalListener`
|
73
67
|
* if no listeners are found in the registry.
|
74
68
|
*
|
75
|
-
* @
|
76
|
-
* @param {string} eventType
|
77
|
-
* @param {EventListenerObject['handleEvent']} listener
|
78
|
-
* @param {AddEventListenerOptions=} options
|
69
|
+
* @type {Listener.ListenerAction<EventTarget>}
|
79
70
|
*/
|
80
71
|
const removeListener = (element, eventType, listener, options) => {
|
81
72
|
// get listener first
|
@@ -94,6 +85,7 @@ const removeListener = (element, eventType, listener, options) => {
|
|
94
85
|
if (!oneEventMap || !oneEventMap.size) delete EventRegistry[eventType];
|
95
86
|
|
96
87
|
// remove listener last
|
88
|
+
/* istanbul ignore else */
|
97
89
|
if (!oneElementMap || !oneElementMap.size) {
|
98
90
|
element.removeEventListener(eventType, globalListener, eventOptions);
|
99
91
|
}
|
@@ -195,12 +187,6 @@ const keydownEvent = 'keydown';
|
|
195
187
|
*/
|
196
188
|
const changeEvent = 'change';
|
197
189
|
|
198
|
-
/**
|
199
|
-
* A global namespace for `touchstart` event.
|
200
|
-
* @type {string}
|
201
|
-
*/
|
202
|
-
const touchstartEvent = 'touchstart';
|
203
|
-
|
204
190
|
/**
|
205
191
|
* A global namespace for `touchmove` event.
|
206
192
|
* @type {string}
|
@@ -208,28 +194,22 @@ const touchstartEvent = 'touchstart';
|
|
208
194
|
const touchmoveEvent = 'touchmove';
|
209
195
|
|
210
196
|
/**
|
211
|
-
* A global namespace for `
|
197
|
+
* A global namespace for `pointerdown` event.
|
212
198
|
* @type {string}
|
213
199
|
*/
|
214
|
-
const
|
200
|
+
const pointerdownEvent = 'pointerdown';
|
215
201
|
|
216
202
|
/**
|
217
|
-
* A global namespace for `
|
203
|
+
* A global namespace for `pointermove` event.
|
218
204
|
* @type {string}
|
219
205
|
*/
|
220
|
-
const
|
206
|
+
const pointermoveEvent = 'pointermove';
|
221
207
|
|
222
208
|
/**
|
223
|
-
* A global namespace for `
|
209
|
+
* A global namespace for `pointerup` event.
|
224
210
|
* @type {string}
|
225
211
|
*/
|
226
|
-
const
|
227
|
-
|
228
|
-
/**
|
229
|
-
* A global namespace for `mouseup` event.
|
230
|
-
* @type {string}
|
231
|
-
*/
|
232
|
-
const mouseupEvent = 'mouseup';
|
212
|
+
const pointerupEvent = 'pointerup';
|
233
213
|
|
234
214
|
/**
|
235
215
|
* A global namespace for `scroll` event.
|
@@ -277,27 +257,6 @@ function getDocumentElement(node) {
|
|
277
257
|
return getDocument(node).documentElement;
|
278
258
|
}
|
279
259
|
|
280
|
-
/**
|
281
|
-
* Returns the `Window` object of a target node.
|
282
|
-
* @see https://github.com/floating-ui/floating-ui
|
283
|
-
*
|
284
|
-
* @param {(Node | HTMLElement | Element | Window)=} node target node
|
285
|
-
* @returns {globalThis}
|
286
|
-
*/
|
287
|
-
function getWindow(node) {
|
288
|
-
if (node == null) {
|
289
|
-
return window;
|
290
|
-
}
|
291
|
-
|
292
|
-
if (!(node instanceof Window)) {
|
293
|
-
const { ownerDocument } = node;
|
294
|
-
return ownerDocument ? ownerDocument.defaultView || window : window;
|
295
|
-
}
|
296
|
-
|
297
|
-
// @ts-ignore
|
298
|
-
return node;
|
299
|
-
}
|
300
|
-
|
301
260
|
/**
|
302
261
|
* Shortcut for `window.getComputedStyle(element).propertyName`
|
303
262
|
* static method.
|
@@ -1394,7 +1353,7 @@ function inputToRGB(input) {
|
|
1394
1353
|
format = 'hwb';
|
1395
1354
|
}
|
1396
1355
|
if (isValidCSSUnit(color.a)) {
|
1397
|
-
a = color.a;
|
1356
|
+
a = color.a;
|
1398
1357
|
a = isPercentage(`${a}`) || parseFloat(a) > 1 ? bound01(a, 100) : a;
|
1399
1358
|
}
|
1400
1359
|
}
|
@@ -1405,9 +1364,6 @@ function inputToRGB(input) {
|
|
1405
1364
|
return {
|
1406
1365
|
ok,
|
1407
1366
|
format,
|
1408
|
-
// r: Math.min(255, Math.max(rgb.r, 0)),
|
1409
|
-
// g: Math.min(255, Math.max(rgb.g, 0)),
|
1410
|
-
// b: Math.min(255, Math.max(rgb.b, 0)),
|
1411
1367
|
r: rgb.r,
|
1412
1368
|
g: rgb.g,
|
1413
1369
|
b: rgb.b,
|
@@ -2246,17 +2202,16 @@ function getColorMenu(self, colorsSource, menuClass) {
|
|
2246
2202
|
const isOptionsMenu = menuClass === 'color-options';
|
2247
2203
|
const isPalette = colorsSource instanceof ColorPalette;
|
2248
2204
|
const menuLabel = isOptionsMenu ? presetsLabel : defaultsLabel;
|
2249
|
-
|
2250
|
-
colorsArray = colorsArray instanceof Array ? colorsArray : [];
|
2205
|
+
const colorsArray = isPalette ? colorsSource.colors : colorsSource;
|
2251
2206
|
const colorsCount = colorsArray.length;
|
2252
2207
|
const { lightSteps } = isPalette ? colorsSource : { lightSteps: null };
|
2253
|
-
const fit = lightSteps || [9, 10].find((x) => colorsCount
|
2208
|
+
const fit = lightSteps || [9, 10].find((x) => colorsCount >= x * 2 && !(colorsCount % x)) || 5;
|
2254
2209
|
const isMultiLine = isOptionsMenu && colorsCount > fit;
|
2255
2210
|
let rowCountHover = 2;
|
2256
|
-
rowCountHover = isMultiLine && colorsCount
|
2257
|
-
rowCountHover = colorsCount
|
2258
|
-
rowCountHover = colorsCount
|
2259
|
-
const rowCount = rowCountHover - (colorsCount
|
2211
|
+
rowCountHover = isMultiLine && colorsCount > fit * 2 ? 3 : rowCountHover;
|
2212
|
+
rowCountHover = isMultiLine && colorsCount > fit * 3 ? 4 : rowCountHover;
|
2213
|
+
rowCountHover = isMultiLine && colorsCount > fit * 4 ? 5 : rowCountHover;
|
2214
|
+
const rowCount = rowCountHover - (colorsCount <= fit * 3 ? 1 : 2);
|
2260
2215
|
const isScrollable = isMultiLine && colorsCount > rowCount * fit;
|
2261
2216
|
let finalClass = menuClass;
|
2262
2217
|
finalClass += isScrollable ? ' scrollable' : '';
|
@@ -2264,7 +2219,7 @@ function getColorMenu(self, colorsSource, menuClass) {
|
|
2264
2219
|
const gap = isMultiLine ? '1px' : '0.25rem';
|
2265
2220
|
let optionSize = isMultiLine ? 1.75 : 2;
|
2266
2221
|
optionSize = fit > 5 && isMultiLine ? 1.5 : optionSize;
|
2267
|
-
const menuHeight = `${
|
2222
|
+
const menuHeight = `${rowCount * optionSize}rem`;
|
2268
2223
|
const menuHeightHover = `calc(${rowCountHover} * ${optionSize}rem + ${rowCountHover - 1} * ${gap})`;
|
2269
2224
|
/** @type {HTMLUListElement} */
|
2270
2225
|
// @ts-ignore -- <UL> is an `HTMLElement`
|
@@ -2371,16 +2326,14 @@ function setMarkup(self) {
|
|
2371
2326
|
});
|
2372
2327
|
|
2373
2328
|
// color presets
|
2374
|
-
if (
|
2375
|
-
|
2376
|
-
const presetsMenu = getColorMenu(self, colorPresets, 'color-options');
|
2377
|
-
presetsDropdown.append(presetsMenu);
|
2329
|
+
if (colorPresets) {
|
2330
|
+
presetsDropdown.append(getColorMenu(self, colorPresets, 'color-options'));
|
2378
2331
|
}
|
2379
2332
|
|
2380
2333
|
// explicit defaults [reset, initial, inherit, transparent, currentColor]
|
2334
|
+
// also custom defaults [default: #069, complementary: #930]
|
2381
2335
|
if (colorKeywords && colorKeywords.length) {
|
2382
|
-
|
2383
|
-
presetsDropdown.append(keywordsMenu);
|
2336
|
+
presetsDropdown.append(getColorMenu(self, colorKeywords, 'color-defaults'));
|
2384
2337
|
}
|
2385
2338
|
|
2386
2339
|
const presetsBtn = createElement({
|
@@ -2417,9 +2370,7 @@ function setMarkup(self) {
|
|
2417
2370
|
setAttribute(input, tabIndex, '-1');
|
2418
2371
|
}
|
2419
2372
|
|
2420
|
-
var version = "
|
2421
|
-
|
2422
|
-
// @ts-ignore
|
2373
|
+
var version = "1.0.1";
|
2423
2374
|
|
2424
2375
|
const Version = version;
|
2425
2376
|
|
@@ -2439,7 +2390,7 @@ const colorPickerDefaults = {
|
|
2439
2390
|
// ColorPicker Static Methods
|
2440
2391
|
// ==========================
|
2441
2392
|
|
2442
|
-
/** @type {CP.GetInstance<ColorPicker>} */
|
2393
|
+
/** @type {CP.GetInstance<ColorPicker, HTMLInputElement>} */
|
2443
2394
|
const getColorPickerInstance = (element) => getInstance(element, colorPickerString);
|
2444
2395
|
|
2445
2396
|
/** @type {CP.InitCallback<ColorPicker>} */
|
@@ -2474,17 +2425,12 @@ function toggleEventsOnShown(self, action) {
|
|
2474
2425
|
const fn = action ? addListener : removeListener;
|
2475
2426
|
const { input, colorMenu, parent } = self;
|
2476
2427
|
const doc = getDocument(input);
|
2477
|
-
const win =
|
2478
|
-
const pointerEvents = `on${touchstartEvent}` in doc
|
2479
|
-
? { down: touchstartEvent, move: touchmoveEvent, up: touchendEvent }
|
2480
|
-
: { down: mousedownEvent, move: mousemoveEvent, up: mouseupEvent };
|
2428
|
+
const win = doc.defaultView;
|
2481
2429
|
|
2482
|
-
fn(self.controls,
|
2430
|
+
fn(self.controls, pointerdownEvent, self.pointerDown);
|
2483
2431
|
self.controlKnobs.forEach((x) => fn(x, keydownEvent, self.handleKnobs));
|
2484
2432
|
|
2485
|
-
// @ts-ignore -- this is `Window`
|
2486
2433
|
fn(win, scrollEvent, self.handleScroll);
|
2487
|
-
// @ts-ignore -- this is `Window`
|
2488
2434
|
fn(win, resizeEvent, self.update);
|
2489
2435
|
|
2490
2436
|
[input, ...self.inputs].forEach((x) => fn(x, changeEvent, self.changeHandler));
|
@@ -2494,8 +2440,8 @@ function toggleEventsOnShown(self, action) {
|
|
2494
2440
|
fn(colorMenu, keydownEvent, self.menuKeyHandler);
|
2495
2441
|
}
|
2496
2442
|
|
2497
|
-
fn(doc,
|
2498
|
-
fn(doc,
|
2443
|
+
fn(doc, pointermoveEvent, self.pointerMove);
|
2444
|
+
fn(doc, pointerupEvent, self.pointerUp);
|
2499
2445
|
fn(parent, focusoutEvent, self.handleFocusOut);
|
2500
2446
|
fn(doc, keyupEvent, self.handleDismiss);
|
2501
2447
|
}
|
@@ -2514,6 +2460,7 @@ function firePickerChange(self) {
|
|
2514
2460
|
* @returns {void}
|
2515
2461
|
*/
|
2516
2462
|
function removePosition(element) {
|
2463
|
+
/* istanbul ignore else */
|
2517
2464
|
if (element) {
|
2518
2465
|
['bottom', 'top'].forEach((x) => removeClass(element, x));
|
2519
2466
|
}
|
@@ -2577,7 +2524,6 @@ class ColorPicker {
|
|
2577
2524
|
constructor(target, config) {
|
2578
2525
|
const self = this;
|
2579
2526
|
/** @type {HTMLInputElement} */
|
2580
|
-
// @ts-ignore
|
2581
2527
|
const input = querySelector(target);
|
2582
2528
|
|
2583
2529
|
// invalidate
|
@@ -2588,7 +2534,6 @@ class ColorPicker {
|
|
2588
2534
|
if (!parent) throw new TypeError('ColorPicker requires a specific markup to work.');
|
2589
2535
|
|
2590
2536
|
/** @type {HTMLElement} */
|
2591
|
-
// @ts-ignore
|
2592
2537
|
self.parent = parent;
|
2593
2538
|
|
2594
2539
|
/** @type {number} */
|
@@ -2616,6 +2561,7 @@ class ColorPicker {
|
|
2616
2561
|
} = normalizeOptions(this.isCE ? parent : input, colorPickerDefaults, config || {});
|
2617
2562
|
|
2618
2563
|
let translatedColorLabels = colorNames;
|
2564
|
+
/* istanbul ignore else */
|
2619
2565
|
if (colorLabels instanceof Array && colorLabels.length === 17) {
|
2620
2566
|
translatedColorLabels = colorLabels;
|
2621
2567
|
} else if (colorLabels && colorLabels.split(',').length === 17) {
|
@@ -2632,7 +2578,7 @@ class ColorPicker {
|
|
2632
2578
|
? JSON.parse(componentLabels) : componentLabels;
|
2633
2579
|
|
2634
2580
|
/** @type {Record<string, string>} */
|
2635
|
-
self.componentLabels = ObjectAssign(colorPickerLabels, tempComponentLabels);
|
2581
|
+
self.componentLabels = ObjectAssign({ ...colorPickerLabels }, tempComponentLabels);
|
2636
2582
|
|
2637
2583
|
/** @type {Color} */
|
2638
2584
|
self.color = new Color(input.value || '#fff', format);
|
@@ -2641,14 +2587,14 @@ class ColorPicker {
|
|
2641
2587
|
self.format = format;
|
2642
2588
|
|
2643
2589
|
// set colour defaults
|
2644
|
-
if (colorKeywords instanceof Array) {
|
2590
|
+
if (colorKeywords instanceof Array && colorKeywords.length) {
|
2645
2591
|
self.colorKeywords = colorKeywords;
|
2646
2592
|
} else if (typeof colorKeywords === 'string' && colorKeywords.length) {
|
2647
2593
|
self.colorKeywords = colorKeywords.split(',').map((x) => x.trim());
|
2648
2594
|
}
|
2649
2595
|
|
2650
2596
|
// set colour presets
|
2651
|
-
if (colorPresets instanceof Array) {
|
2597
|
+
if (colorPresets instanceof Array && colorPresets.length) {
|
2652
2598
|
self.colorPresets = colorPresets;
|
2653
2599
|
} else if (typeof colorPresets === 'string' && colorPresets.length) {
|
2654
2600
|
if (isValidJSON(colorPresets)) {
|
@@ -2681,26 +2627,20 @@ class ColorPicker {
|
|
2681
2627
|
const [colorPicker, colorMenu] = getElementsByClassName('color-dropdown', parent);
|
2682
2628
|
// set main elements
|
2683
2629
|
/** @type {HTMLElement} */
|
2684
|
-
// @ts-ignore
|
2685
2630
|
self.pickerToggle = querySelector('.picker-toggle', parent);
|
2686
2631
|
/** @type {HTMLElement} */
|
2687
|
-
// @ts-ignore
|
2688
2632
|
self.menuToggle = querySelector('.menu-toggle', parent);
|
2689
2633
|
/** @type {HTMLElement} */
|
2690
|
-
// @ts-ignore
|
2691
2634
|
self.colorPicker = colorPicker;
|
2692
2635
|
/** @type {HTMLElement} */
|
2693
|
-
// @ts-ignore
|
2694
2636
|
self.colorMenu = colorMenu;
|
2695
2637
|
/** @type {HTMLInputElement[]} */
|
2696
|
-
// @ts-ignore
|
2697
2638
|
self.inputs = [...getElementsByClassName('color-input', parent)];
|
2698
2639
|
const [controls] = getElementsByClassName('color-controls', parent);
|
2699
2640
|
self.controls = controls;
|
2700
2641
|
/** @type {(HTMLElement | Element)[]} */
|
2701
2642
|
self.controlKnobs = [...getElementsByClassName('knob', controls)];
|
2702
2643
|
/** @type {(HTMLElement)[]} */
|
2703
|
-
// @ts-ignore
|
2704
2644
|
self.visuals = [...getElementsByClassName('visual-control', controls)];
|
2705
2645
|
|
2706
2646
|
// update colour picker controls, inputs and visuals
|
@@ -2779,6 +2719,7 @@ class ColorPicker {
|
|
2779
2719
|
let colorName;
|
2780
2720
|
|
2781
2721
|
// determine color appearance
|
2722
|
+
/* istanbul ignore else */
|
2782
2723
|
if (lightness === 100 && saturation === 0) {
|
2783
2724
|
colorName = colorLabels.white;
|
2784
2725
|
} else if (lightness === 0) {
|
@@ -2852,7 +2793,6 @@ class ColorPicker {
|
|
2852
2793
|
* @this {ColorPicker}
|
2853
2794
|
*/
|
2854
2795
|
handleFocusOut({ relatedTarget }) {
|
2855
|
-
// @ts-ignore
|
2856
2796
|
if (relatedTarget && !this.parent.contains(relatedTarget)) {
|
2857
2797
|
this.hide(true);
|
2858
2798
|
}
|
@@ -2879,13 +2819,14 @@ class ColorPicker {
|
|
2879
2819
|
const self = this;
|
2880
2820
|
const { activeElement } = getDocument(self.input);
|
2881
2821
|
|
2882
|
-
|
2822
|
+
self.updateDropdownPosition();
|
2823
|
+
|
2824
|
+
/* istanbul ignore next */
|
2825
|
+
if (([pointermoveEvent, touchmoveEvent].includes(e.type) && self.dragElement)
|
2883
2826
|
|| (activeElement && self.controlKnobs.includes(activeElement))) {
|
2884
2827
|
e.stopPropagation();
|
2885
2828
|
e.preventDefault();
|
2886
2829
|
}
|
2887
|
-
|
2888
|
-
self.updateDropdownPosition();
|
2889
2830
|
}
|
2890
2831
|
|
2891
2832
|
/**
|
@@ -2895,7 +2836,6 @@ class ColorPicker {
|
|
2895
2836
|
*/
|
2896
2837
|
menuKeyHandler(e) {
|
2897
2838
|
const { target, code } = e;
|
2898
|
-
// @ts-ignore
|
2899
2839
|
const { previousElementSibling, nextElementSibling, parentElement } = target;
|
2900
2840
|
const isColorOptionsMenu = parentElement && hasClass(parentElement, 'color-options');
|
2901
2841
|
const allSiblings = [...parentElement.children];
|
@@ -2934,20 +2874,20 @@ class ColorPicker {
|
|
2934
2874
|
|
2935
2875
|
/**
|
2936
2876
|
* The `ColorPicker` click event listener for the colour menu presets / defaults.
|
2937
|
-
* @param {
|
2877
|
+
* @param {Event} e
|
2938
2878
|
* @this {ColorPicker}
|
2939
2879
|
*/
|
2940
2880
|
menuClickHandler(e) {
|
2941
2881
|
const self = this;
|
2942
|
-
/** @type {*} */
|
2943
2882
|
const { target } = e;
|
2944
2883
|
const { colorMenu } = self;
|
2945
2884
|
const newOption = (getAttribute(target, 'data-value') || '').trim();
|
2946
2885
|
// invalidate for targets other than color options
|
2947
2886
|
if (!newOption.length) return;
|
2948
2887
|
const currentActive = querySelector('li.active', colorMenu);
|
2949
|
-
let newColor =
|
2950
|
-
newColor =
|
2888
|
+
let newColor = newOption;
|
2889
|
+
newColor = nonColors.includes(newColor) ? 'white' : newColor;
|
2890
|
+
newColor = newColor === 'transparent' ? 'rgba(0,0,0,0)' : newColor;
|
2951
2891
|
|
2952
2892
|
const {
|
2953
2893
|
r, g, b, a,
|
@@ -2959,7 +2899,9 @@ class ColorPicker {
|
|
2959
2899
|
|
2960
2900
|
self.update();
|
2961
2901
|
|
2902
|
+
/* istanbul ignore else */
|
2962
2903
|
if (currentActive !== target) {
|
2904
|
+
/* istanbul ignore else */
|
2963
2905
|
if (currentActive) {
|
2964
2906
|
removeClass(currentActive, 'active');
|
2965
2907
|
removeAttribute(currentActive, ariaSelected);
|
@@ -2977,15 +2919,13 @@ class ColorPicker {
|
|
2977
2919
|
|
2978
2920
|
/**
|
2979
2921
|
* The `ColorPicker` *touchstart* / *mousedown* events listener for control knobs.
|
2980
|
-
* @param {
|
2922
|
+
* @param {PointerEvent} e
|
2981
2923
|
* @this {ColorPicker}
|
2982
2924
|
*/
|
2983
2925
|
pointerDown(e) {
|
2984
2926
|
const self = this;
|
2985
2927
|
/** @type {*} */
|
2986
|
-
const {
|
2987
|
-
type, target, touches, pageX, pageY,
|
2988
|
-
} = e;
|
2928
|
+
const { target, pageX, pageY } = e;
|
2989
2929
|
const { colorMenu, visuals, controlKnobs } = self;
|
2990
2930
|
const [v1, v2, v3] = visuals;
|
2991
2931
|
const [c1, c2, c3] = controlKnobs;
|
@@ -2993,11 +2933,10 @@ class ColorPicker {
|
|
2993
2933
|
const visual = controlKnobs.includes(target) ? target.previousElementSibling : target;
|
2994
2934
|
const visualRect = getBoundingClientRect(visual);
|
2995
2935
|
const html = getDocumentElement(v1);
|
2996
|
-
const
|
2997
|
-
const
|
2998
|
-
const offsetX = X - html.scrollLeft - visualRect.left;
|
2999
|
-
const offsetY = Y - html.scrollTop - visualRect.top;
|
2936
|
+
const offsetX = pageX - html.scrollLeft - visualRect.left;
|
2937
|
+
const offsetY = pageY - html.scrollTop - visualRect.top;
|
3000
2938
|
|
2939
|
+
/* istanbul ignore else */
|
3001
2940
|
if (target === v1 || target === c1) {
|
3002
2941
|
self.dragElement = visual;
|
3003
2942
|
self.changeControl1(offsetX, offsetY);
|
@@ -3021,7 +2960,7 @@ class ColorPicker {
|
|
3021
2960
|
|
3022
2961
|
/**
|
3023
2962
|
* The `ColorPicker` *touchend* / *mouseup* events listener for control knobs.
|
3024
|
-
* @param {
|
2963
|
+
* @param {PointerEvent} e
|
3025
2964
|
* @this {ColorPicker}
|
3026
2965
|
*/
|
3027
2966
|
pointerUp({ target }) {
|
@@ -3030,9 +2969,8 @@ class ColorPicker {
|
|
3030
2969
|
const doc = getDocument(parent);
|
3031
2970
|
const currentOpen = querySelector(`${colorPickerParentSelector}.open`, doc) !== null;
|
3032
2971
|
const selection = doc.getSelection();
|
3033
|
-
|
2972
|
+
|
3034
2973
|
if (!self.dragElement && !selection.toString().length
|
3035
|
-
// @ts-ignore
|
3036
2974
|
&& !parent.contains(target)) {
|
3037
2975
|
self.hide(currentOpen);
|
3038
2976
|
}
|
@@ -3042,25 +2980,20 @@ class ColorPicker {
|
|
3042
2980
|
|
3043
2981
|
/**
|
3044
2982
|
* The `ColorPicker` *touchmove* / *mousemove* events listener for control knobs.
|
3045
|
-
* @param {
|
2983
|
+
* @param {PointerEvent} e
|
3046
2984
|
*/
|
3047
2985
|
pointerMove(e) {
|
3048
2986
|
const self = this;
|
3049
2987
|
const { dragElement, visuals } = self;
|
3050
2988
|
const [v1, v2, v3] = visuals;
|
3051
|
-
const {
|
3052
|
-
// @ts-ignore
|
3053
|
-
type, touches, pageX, pageY,
|
3054
|
-
} = e;
|
2989
|
+
const { pageX, pageY } = e;
|
3055
2990
|
|
3056
2991
|
if (!dragElement) return;
|
3057
2992
|
|
3058
2993
|
const controlRect = getBoundingClientRect(dragElement);
|
3059
2994
|
const win = getDocumentElement(v1);
|
3060
|
-
const
|
3061
|
-
const
|
3062
|
-
const offsetX = X - win.scrollLeft - controlRect.left;
|
3063
|
-
const offsetY = Y - win.scrollTop - controlRect.top;
|
2995
|
+
const offsetX = pageX - win.scrollLeft - controlRect.left;
|
2996
|
+
const offsetY = pageY - win.scrollTop - controlRect.top;
|
3064
2997
|
|
3065
2998
|
if (dragElement === v1) {
|
3066
2999
|
self.changeControl1(offsetX, offsetY);
|
@@ -3094,13 +3027,16 @@ class ColorPicker {
|
|
3094
3027
|
const currentKnob = controlKnobs.find((x) => x === activeElement);
|
3095
3028
|
const yRatio = offsetHeight / 360;
|
3096
3029
|
|
3030
|
+
/* istanbul ignore else */
|
3097
3031
|
if (currentKnob) {
|
3098
3032
|
let offsetX = 0;
|
3099
3033
|
let offsetY = 0;
|
3100
3034
|
|
3035
|
+
/* istanbul ignore else */
|
3101
3036
|
if (target === c1) {
|
3102
3037
|
const xRatio = offsetWidth / 100;
|
3103
3038
|
|
3039
|
+
/* istanbul ignore else */
|
3104
3040
|
if ([keyArrowLeft, keyArrowRight].includes(code)) {
|
3105
3041
|
self.controlPositions.c1x += code === keyArrowRight ? xRatio : -xRatio;
|
3106
3042
|
} else if ([keyArrowUp, keyArrowDown].includes(code)) {
|
@@ -3146,6 +3082,7 @@ class ColorPicker {
|
|
3146
3082
|
const isNonColorValue = self.hasNonColor && nonColors.includes(currentValue);
|
3147
3083
|
const alpha = i4 ? v4 : (1 - controlPositions.c3y / offsetHeight);
|
3148
3084
|
|
3085
|
+
/* istanbul ignore else */
|
3149
3086
|
if (activeElement === input || (activeElement && inputs.includes(activeElement))) {
|
3150
3087
|
if (activeElement === input) {
|
3151
3088
|
if (isNonColorValue) {
|
@@ -3460,6 +3397,7 @@ class ColorPicker {
|
|
3460
3397
|
const hue = roundPart(hsl.h * 360);
|
3461
3398
|
let newColor;
|
3462
3399
|
|
3400
|
+
/* istanbul ignore else */
|
3463
3401
|
if (format === 'hex') {
|
3464
3402
|
newColor = self.color.toHexString(true);
|
3465
3403
|
i1.value = self.hex;
|
@@ -3560,15 +3498,15 @@ class ColorPicker {
|
|
3560
3498
|
const relatedBtn = openPicker ? pickerToggle : menuToggle;
|
3561
3499
|
const animationDuration = openDropdown && getElementTransitionDuration(openDropdown);
|
3562
3500
|
|
3563
|
-
// if (!self.isValid) {
|
3564
3501
|
self.value = self.color.toString(true);
|
3565
|
-
// }
|
3566
3502
|
|
3503
|
+
/* istanbul ignore else */
|
3567
3504
|
if (openDropdown) {
|
3568
3505
|
removeClass(openDropdown, 'show');
|
3569
3506
|
setAttribute(relatedBtn, ariaExpanded, 'false');
|
3570
3507
|
setTimeout(() => {
|
3571
3508
|
removePosition(openDropdown);
|
3509
|
+
/* istanbul ignore else */
|
3572
3510
|
if (!querySelector('.show', parent)) {
|
3573
3511
|
removeClass(parent, 'open');
|
3574
3512
|
toggleEventsOnShown(self);
|
@@ -3581,7 +3519,7 @@ class ColorPicker {
|
|
3581
3519
|
focus(pickerToggle);
|
3582
3520
|
}
|
3583
3521
|
setAttribute(input, tabIndex, '-1');
|
3584
|
-
if (menuToggle) {
|
3522
|
+
if (relatedBtn === menuToggle) {
|
3585
3523
|
setAttribute(menuToggle, tabIndex, '-1');
|
3586
3524
|
}
|
3587
3525
|
}
|
@@ -3619,4 +3557,9 @@ ObjectAssign(ColorPicker, {
|
|
3619
3557
|
getBoundingClientRect,
|
3620
3558
|
});
|
3621
3559
|
|
3560
|
+
/**
|
3561
|
+
* A single import is required to add the `CP` namespace to `src` sources.
|
3562
|
+
* @typedef {import("../../types/index")}
|
3563
|
+
*/
|
3564
|
+
|
3622
3565
|
export { ColorPicker as default };
|