@thednp/color-picker 0.0.2-alpha5 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. package/README.md +21 -19
  2. package/dist/css/color-picker.css +82 -46
  3. package/dist/css/color-picker.min.css +2 -2
  4. package/dist/css/color-picker.rtl.css +82 -46
  5. package/dist/css/color-picker.rtl.min.css +2 -2
  6. package/dist/js/color-esm.js +2 -5
  7. package/dist/js/color-esm.min.js +1 -1
  8. package/dist/js/color-palette-esm.js +2 -5
  9. package/dist/js/color-palette-esm.min.js +1 -1
  10. package/dist/js/color-palette.js +2 -5
  11. package/dist/js/color-palette.min.js +1 -1
  12. package/dist/js/color-picker-element-esm.js +184 -189
  13. package/dist/js/color-picker-element-esm.min.js +2 -2
  14. package/dist/js/color-picker-element.js +184 -189
  15. package/dist/js/color-picker-element.min.js +2 -2
  16. package/dist/js/color-picker-esm.js +77 -134
  17. package/dist/js/color-picker-esm.min.js +2 -2
  18. package/dist/js/color-picker.js +77 -134
  19. package/dist/js/color-picker.min.js +2 -2
  20. package/dist/js/color.js +2 -5
  21. package/dist/js/color.min.js +1 -1
  22. package/package.json +20 -19
  23. package/src/js/color-picker-element.js +45 -37
  24. package/src/js/color-picker.js +46 -60
  25. package/src/js/color.js +1 -4
  26. package/src/js/index.js +5 -0
  27. package/src/js/util/getColorMenu.js +7 -8
  28. package/src/js/util/setMarkup.js +4 -7
  29. package/src/js/util/toggleCEAttr.js +70 -0
  30. package/src/js/util/version.js +0 -1
  31. package/src/js/version.js +0 -1
  32. package/src/scss/_variables.scss +7 -0
  33. package/src/scss/color-picker.scss +86 -45
  34. package/types/cp.d.ts +31 -17
  35. package/types/index.d.ts +0 -4
  36. package/types/source/source.ts +0 -1
  37. package/types/source/types.d.ts +8 -6
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * ColorPicker v0.0.2alpha5 (http://thednp.github.io/color-picker)
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
  */
@@ -15,27 +15,26 @@
15
15
  /**
16
16
  * The global event listener.
17
17
  *
18
- * @this {Element | HTMLElement | Window | Document}
19
- * @param {Event} e
20
- * @returns {void}
18
+ * @type {EventListener}
19
+ * @this {EventTarget}
21
20
  */
22
21
  function globalListener(e) {
23
22
  const that = this;
24
23
  const { type } = e;
25
- const oneEvMap = EventRegistry[type] ? [...EventRegistry[type]] : [];
26
24
 
27
- oneEvMap.forEach((elementsMap) => {
25
+ [...EventRegistry[type]].forEach((elementsMap) => {
28
26
  const [element, listenersMap] = elementsMap;
29
- [...listenersMap].forEach((listenerMap) => {
30
- if (element === that) {
27
+ /* istanbul ignore else */
28
+ if (element === that) {
29
+ [...listenersMap].forEach((listenerMap) => {
31
30
  const [listener, options] = listenerMap;
32
31
  listener.apply(element, [e]);
33
32
 
34
33
  if (options && options.once) {
35
34
  removeListener(element, type, listener, options);
36
35
  }
37
- }
38
- });
36
+ });
37
+ }
39
38
  });
40
39
  }
41
40
 
@@ -43,10 +42,7 @@
43
42
  * Register a new listener with its options and attach the `globalListener`
44
43
  * to the target if this is the first listener.
45
44
  *
46
- * @param {Element | HTMLElement | Window | Document} element
47
- * @param {string} eventType
48
- * @param {EventListenerObject['handleEvent']} listener
49
- * @param {AddEventListenerOptions=} options
45
+ * @type {Listener.ListenerAction<EventTarget>}
50
46
  */
51
47
  const addListener = (element, eventType, listener, options) => {
52
48
  // get element listeners first
@@ -64,9 +60,7 @@
64
60
  const { size } = oneElementMap;
65
61
 
66
62
  // register listener with its options
67
- if (oneElementMap) {
68
- oneElementMap.set(listener, options);
69
- }
63
+ oneElementMap.set(listener, options);
70
64
 
71
65
  // add listener last
72
66
  if (!size) {
@@ -78,10 +72,7 @@
78
72
  * Remove a listener from registry and detach the `globalListener`
79
73
  * if no listeners are found in the registry.
80
74
  *
81
- * @param {Element | HTMLElement | Window | Document} element
82
- * @param {string} eventType
83
- * @param {EventListenerObject['handleEvent']} listener
84
- * @param {AddEventListenerOptions=} options
75
+ * @type {Listener.ListenerAction<EventTarget>}
85
76
  */
86
77
  const removeListener = (element, eventType, listener, options) => {
87
78
  // get listener first
@@ -100,6 +91,7 @@
100
91
  if (!oneEventMap || !oneEventMap.size) delete EventRegistry[eventType];
101
92
 
102
93
  // remove listener last
94
+ /* istanbul ignore else */
103
95
  if (!oneElementMap || !oneElementMap.size) {
104
96
  element.removeEventListener(eventType, globalListener, eventOptions);
105
97
  }
@@ -201,12 +193,6 @@
201
193
  */
202
194
  const changeEvent = 'change';
203
195
 
204
- /**
205
- * A global namespace for `touchstart` event.
206
- * @type {string}
207
- */
208
- const touchstartEvent = 'touchstart';
209
-
210
196
  /**
211
197
  * A global namespace for `touchmove` event.
212
198
  * @type {string}
@@ -214,28 +200,22 @@
214
200
  const touchmoveEvent = 'touchmove';
215
201
 
216
202
  /**
217
- * A global namespace for `touchend` event.
203
+ * A global namespace for `pointerdown` event.
218
204
  * @type {string}
219
205
  */
220
- const touchendEvent = 'touchend';
206
+ const pointerdownEvent = 'pointerdown';
221
207
 
222
208
  /**
223
- * A global namespace for `mousedown` event.
209
+ * A global namespace for `pointermove` event.
224
210
  * @type {string}
225
211
  */
226
- const mousedownEvent = 'mousedown';
212
+ const pointermoveEvent = 'pointermove';
227
213
 
228
214
  /**
229
- * A global namespace for `mousemove` event.
215
+ * A global namespace for `pointerup` event.
230
216
  * @type {string}
231
217
  */
232
- const mousemoveEvent = 'mousemove';
233
-
234
- /**
235
- * A global namespace for `mouseup` event.
236
- * @type {string}
237
- */
238
- const mouseupEvent = 'mouseup';
218
+ const pointerupEvent = 'pointerup';
239
219
 
240
220
  /**
241
221
  * A global namespace for `scroll` event.
@@ -283,27 +263,6 @@
283
263
  return getDocument(node).documentElement;
284
264
  }
285
265
 
286
- /**
287
- * Returns the `Window` object of a target node.
288
- * @see https://github.com/floating-ui/floating-ui
289
- *
290
- * @param {(Node | HTMLElement | Element | Window)=} node target node
291
- * @returns {globalThis}
292
- */
293
- function getWindow(node) {
294
- if (node == null) {
295
- return window;
296
- }
297
-
298
- if (!(node instanceof Window)) {
299
- const { ownerDocument } = node;
300
- return ownerDocument ? ownerDocument.defaultView || window : window;
301
- }
302
-
303
- // @ts-ignore
304
- return node;
305
- }
306
-
307
266
  /**
308
267
  * Shortcut for `window.getComputedStyle(element).propertyName`
309
268
  * static method.
@@ -1400,7 +1359,7 @@
1400
1359
  format = 'hwb';
1401
1360
  }
1402
1361
  if (isValidCSSUnit(color.a)) {
1403
- a = color.a; // @ts-ignore -- `parseFloat` works with numbers too
1362
+ a = color.a;
1404
1363
  a = isPercentage(`${a}`) || parseFloat(a) > 1 ? bound01(a, 100) : a;
1405
1364
  }
1406
1365
  }
@@ -1411,9 +1370,6 @@
1411
1370
  return {
1412
1371
  ok,
1413
1372
  format,
1414
- // r: Math.min(255, Math.max(rgb.r, 0)),
1415
- // g: Math.min(255, Math.max(rgb.g, 0)),
1416
- // b: Math.min(255, Math.max(rgb.b, 0)),
1417
1373
  r: rgb.r,
1418
1374
  g: rgb.g,
1419
1375
  b: rgb.b,
@@ -2252,17 +2208,16 @@
2252
2208
  const isOptionsMenu = menuClass === 'color-options';
2253
2209
  const isPalette = colorsSource instanceof ColorPalette;
2254
2210
  const menuLabel = isOptionsMenu ? presetsLabel : defaultsLabel;
2255
- let colorsArray = isPalette ? colorsSource.colors : colorsSource;
2256
- colorsArray = colorsArray instanceof Array ? colorsArray : [];
2211
+ const colorsArray = isPalette ? colorsSource.colors : colorsSource;
2257
2212
  const colorsCount = colorsArray.length;
2258
2213
  const { lightSteps } = isPalette ? colorsSource : { lightSteps: null };
2259
- const fit = lightSteps || [9, 10].find((x) => colorsCount > x * 2 && !(colorsCount % x)) || 5;
2214
+ const fit = lightSteps || [9, 10].find((x) => colorsCount >= x * 2 && !(colorsCount % x)) || 5;
2260
2215
  const isMultiLine = isOptionsMenu && colorsCount > fit;
2261
2216
  let rowCountHover = 2;
2262
- rowCountHover = isMultiLine && colorsCount >= fit * 2 ? 3 : rowCountHover;
2263
- rowCountHover = colorsCount >= fit * 3 ? 4 : rowCountHover;
2264
- rowCountHover = colorsCount >= fit * 4 ? 5 : rowCountHover;
2265
- const rowCount = rowCountHover - (colorsCount < fit * 3 ? 1 : 2);
2217
+ rowCountHover = isMultiLine && colorsCount > fit * 2 ? 3 : rowCountHover;
2218
+ rowCountHover = isMultiLine && colorsCount > fit * 3 ? 4 : rowCountHover;
2219
+ rowCountHover = isMultiLine && colorsCount > fit * 4 ? 5 : rowCountHover;
2220
+ const rowCount = rowCountHover - (colorsCount <= fit * 3 ? 1 : 2);
2266
2221
  const isScrollable = isMultiLine && colorsCount > rowCount * fit;
2267
2222
  let finalClass = menuClass;
2268
2223
  finalClass += isScrollable ? ' scrollable' : '';
@@ -2270,7 +2225,7 @@
2270
2225
  const gap = isMultiLine ? '1px' : '0.25rem';
2271
2226
  let optionSize = isMultiLine ? 1.75 : 2;
2272
2227
  optionSize = fit > 5 && isMultiLine ? 1.5 : optionSize;
2273
- const menuHeight = `${(rowCount || 1) * optionSize}rem`;
2228
+ const menuHeight = `${rowCount * optionSize}rem`;
2274
2229
  const menuHeightHover = `calc(${rowCountHover} * ${optionSize}rem + ${rowCountHover - 1} * ${gap})`;
2275
2230
  /** @type {HTMLUListElement} */
2276
2231
  // @ts-ignore -- <UL> is an `HTMLElement`
@@ -2377,16 +2332,14 @@
2377
2332
  });
2378
2333
 
2379
2334
  // color presets
2380
- if ((colorPresets instanceof Array && colorPresets.length)
2381
- || (colorPresets instanceof ColorPalette && colorPresets.colors)) {
2382
- const presetsMenu = getColorMenu(self, colorPresets, 'color-options');
2383
- presetsDropdown.append(presetsMenu);
2335
+ if (colorPresets) {
2336
+ presetsDropdown.append(getColorMenu(self, colorPresets, 'color-options'));
2384
2337
  }
2385
2338
 
2386
2339
  // explicit defaults [reset, initial, inherit, transparent, currentColor]
2340
+ // also custom defaults [default: #069, complementary: #930]
2387
2341
  if (colorKeywords && colorKeywords.length) {
2388
- const keywordsMenu = getColorMenu(self, colorKeywords, 'color-defaults');
2389
- presetsDropdown.append(keywordsMenu);
2342
+ presetsDropdown.append(getColorMenu(self, colorKeywords, 'color-defaults'));
2390
2343
  }
2391
2344
 
2392
2345
  const presetsBtn = createElement({
@@ -2423,9 +2376,7 @@
2423
2376
  setAttribute(input, tabIndex, '-1');
2424
2377
  }
2425
2378
 
2426
- var version = "0.0.2alpha5";
2427
-
2428
- // @ts-ignore
2379
+ var version = "1.0.1";
2429
2380
 
2430
2381
  const Version = version;
2431
2382
 
@@ -2445,7 +2396,7 @@
2445
2396
  // ColorPicker Static Methods
2446
2397
  // ==========================
2447
2398
 
2448
- /** @type {CP.GetInstance<ColorPicker>} */
2399
+ /** @type {CP.GetInstance<ColorPicker, HTMLInputElement>} */
2449
2400
  const getColorPickerInstance = (element) => getInstance(element, colorPickerString);
2450
2401
 
2451
2402
  /** @type {CP.InitCallback<ColorPicker>} */
@@ -2480,17 +2431,12 @@
2480
2431
  const fn = action ? addListener : removeListener;
2481
2432
  const { input, colorMenu, parent } = self;
2482
2433
  const doc = getDocument(input);
2483
- const win = getWindow(input);
2484
- const pointerEvents = `on${touchstartEvent}` in doc
2485
- ? { down: touchstartEvent, move: touchmoveEvent, up: touchendEvent }
2486
- : { down: mousedownEvent, move: mousemoveEvent, up: mouseupEvent };
2434
+ const win = doc.defaultView;
2487
2435
 
2488
- fn(self.controls, pointerEvents.down, self.pointerDown);
2436
+ fn(self.controls, pointerdownEvent, self.pointerDown);
2489
2437
  self.controlKnobs.forEach((x) => fn(x, keydownEvent, self.handleKnobs));
2490
2438
 
2491
- // @ts-ignore -- this is `Window`
2492
2439
  fn(win, scrollEvent, self.handleScroll);
2493
- // @ts-ignore -- this is `Window`
2494
2440
  fn(win, resizeEvent, self.update);
2495
2441
 
2496
2442
  [input, ...self.inputs].forEach((x) => fn(x, changeEvent, self.changeHandler));
@@ -2500,8 +2446,8 @@
2500
2446
  fn(colorMenu, keydownEvent, self.menuKeyHandler);
2501
2447
  }
2502
2448
 
2503
- fn(doc, pointerEvents.move, self.pointerMove);
2504
- fn(doc, pointerEvents.up, self.pointerUp);
2449
+ fn(doc, pointermoveEvent, self.pointerMove);
2450
+ fn(doc, pointerupEvent, self.pointerUp);
2505
2451
  fn(parent, focusoutEvent, self.handleFocusOut);
2506
2452
  fn(doc, keyupEvent, self.handleDismiss);
2507
2453
  }
@@ -2520,6 +2466,7 @@
2520
2466
  * @returns {void}
2521
2467
  */
2522
2468
  function removePosition(element) {
2469
+ /* istanbul ignore else */
2523
2470
  if (element) {
2524
2471
  ['bottom', 'top'].forEach((x) => removeClass(element, x));
2525
2472
  }
@@ -2583,7 +2530,6 @@
2583
2530
  constructor(target, config) {
2584
2531
  const self = this;
2585
2532
  /** @type {HTMLInputElement} */
2586
- // @ts-ignore
2587
2533
  const input = querySelector(target);
2588
2534
 
2589
2535
  // invalidate
@@ -2594,7 +2540,6 @@
2594
2540
  if (!parent) throw new TypeError('ColorPicker requires a specific markup to work.');
2595
2541
 
2596
2542
  /** @type {HTMLElement} */
2597
- // @ts-ignore
2598
2543
  self.parent = parent;
2599
2544
 
2600
2545
  /** @type {number} */
@@ -2622,6 +2567,7 @@
2622
2567
  } = normalizeOptions(this.isCE ? parent : input, colorPickerDefaults, config || {});
2623
2568
 
2624
2569
  let translatedColorLabels = colorNames;
2570
+ /* istanbul ignore else */
2625
2571
  if (colorLabels instanceof Array && colorLabels.length === 17) {
2626
2572
  translatedColorLabels = colorLabels;
2627
2573
  } else if (colorLabels && colorLabels.split(',').length === 17) {
@@ -2638,7 +2584,7 @@
2638
2584
  ? JSON.parse(componentLabels) : componentLabels;
2639
2585
 
2640
2586
  /** @type {Record<string, string>} */
2641
- self.componentLabels = ObjectAssign(colorPickerLabels, tempComponentLabels);
2587
+ self.componentLabels = ObjectAssign({ ...colorPickerLabels }, tempComponentLabels);
2642
2588
 
2643
2589
  /** @type {Color} */
2644
2590
  self.color = new Color(input.value || '#fff', format);
@@ -2647,14 +2593,14 @@
2647
2593
  self.format = format;
2648
2594
 
2649
2595
  // set colour defaults
2650
- if (colorKeywords instanceof Array) {
2596
+ if (colorKeywords instanceof Array && colorKeywords.length) {
2651
2597
  self.colorKeywords = colorKeywords;
2652
2598
  } else if (typeof colorKeywords === 'string' && colorKeywords.length) {
2653
2599
  self.colorKeywords = colorKeywords.split(',').map((x) => x.trim());
2654
2600
  }
2655
2601
 
2656
2602
  // set colour presets
2657
- if (colorPresets instanceof Array) {
2603
+ if (colorPresets instanceof Array && colorPresets.length) {
2658
2604
  self.colorPresets = colorPresets;
2659
2605
  } else if (typeof colorPresets === 'string' && colorPresets.length) {
2660
2606
  if (isValidJSON(colorPresets)) {
@@ -2687,26 +2633,20 @@
2687
2633
  const [colorPicker, colorMenu] = getElementsByClassName('color-dropdown', parent);
2688
2634
  // set main elements
2689
2635
  /** @type {HTMLElement} */
2690
- // @ts-ignore
2691
2636
  self.pickerToggle = querySelector('.picker-toggle', parent);
2692
2637
  /** @type {HTMLElement} */
2693
- // @ts-ignore
2694
2638
  self.menuToggle = querySelector('.menu-toggle', parent);
2695
2639
  /** @type {HTMLElement} */
2696
- // @ts-ignore
2697
2640
  self.colorPicker = colorPicker;
2698
2641
  /** @type {HTMLElement} */
2699
- // @ts-ignore
2700
2642
  self.colorMenu = colorMenu;
2701
2643
  /** @type {HTMLInputElement[]} */
2702
- // @ts-ignore
2703
2644
  self.inputs = [...getElementsByClassName('color-input', parent)];
2704
2645
  const [controls] = getElementsByClassName('color-controls', parent);
2705
2646
  self.controls = controls;
2706
2647
  /** @type {(HTMLElement | Element)[]} */
2707
2648
  self.controlKnobs = [...getElementsByClassName('knob', controls)];
2708
2649
  /** @type {(HTMLElement)[]} */
2709
- // @ts-ignore
2710
2650
  self.visuals = [...getElementsByClassName('visual-control', controls)];
2711
2651
 
2712
2652
  // update colour picker controls, inputs and visuals
@@ -2785,6 +2725,7 @@
2785
2725
  let colorName;
2786
2726
 
2787
2727
  // determine color appearance
2728
+ /* istanbul ignore else */
2788
2729
  if (lightness === 100 && saturation === 0) {
2789
2730
  colorName = colorLabels.white;
2790
2731
  } else if (lightness === 0) {
@@ -2858,7 +2799,6 @@
2858
2799
  * @this {ColorPicker}
2859
2800
  */
2860
2801
  handleFocusOut({ relatedTarget }) {
2861
- // @ts-ignore
2862
2802
  if (relatedTarget && !this.parent.contains(relatedTarget)) {
2863
2803
  this.hide(true);
2864
2804
  }
@@ -2885,13 +2825,14 @@
2885
2825
  const self = this;
2886
2826
  const { activeElement } = getDocument(self.input);
2887
2827
 
2888
- if ((e.type === touchmoveEvent && self.dragElement)
2828
+ self.updateDropdownPosition();
2829
+
2830
+ /* istanbul ignore next */
2831
+ if (([pointermoveEvent, touchmoveEvent].includes(e.type) && self.dragElement)
2889
2832
  || (activeElement && self.controlKnobs.includes(activeElement))) {
2890
2833
  e.stopPropagation();
2891
2834
  e.preventDefault();
2892
2835
  }
2893
-
2894
- self.updateDropdownPosition();
2895
2836
  }
2896
2837
 
2897
2838
  /**
@@ -2901,7 +2842,6 @@
2901
2842
  */
2902
2843
  menuKeyHandler(e) {
2903
2844
  const { target, code } = e;
2904
- // @ts-ignore
2905
2845
  const { previousElementSibling, nextElementSibling, parentElement } = target;
2906
2846
  const isColorOptionsMenu = parentElement && hasClass(parentElement, 'color-options');
2907
2847
  const allSiblings = [...parentElement.children];
@@ -2940,20 +2880,20 @@
2940
2880
 
2941
2881
  /**
2942
2882
  * The `ColorPicker` click event listener for the colour menu presets / defaults.
2943
- * @param {Partial<Event>} e
2883
+ * @param {Event} e
2944
2884
  * @this {ColorPicker}
2945
2885
  */
2946
2886
  menuClickHandler(e) {
2947
2887
  const self = this;
2948
- /** @type {*} */
2949
2888
  const { target } = e;
2950
2889
  const { colorMenu } = self;
2951
2890
  const newOption = (getAttribute(target, 'data-value') || '').trim();
2952
2891
  // invalidate for targets other than color options
2953
2892
  if (!newOption.length) return;
2954
2893
  const currentActive = querySelector('li.active', colorMenu);
2955
- let newColor = nonColors.includes(newOption) ? 'white' : newOption;
2956
- newColor = newOption === 'transparent' ? 'rgba(0,0,0,0)' : newOption;
2894
+ let newColor = newOption;
2895
+ newColor = nonColors.includes(newColor) ? 'white' : newColor;
2896
+ newColor = newColor === 'transparent' ? 'rgba(0,0,0,0)' : newColor;
2957
2897
 
2958
2898
  const {
2959
2899
  r, g, b, a,
@@ -2965,7 +2905,9 @@
2965
2905
 
2966
2906
  self.update();
2967
2907
 
2908
+ /* istanbul ignore else */
2968
2909
  if (currentActive !== target) {
2910
+ /* istanbul ignore else */
2969
2911
  if (currentActive) {
2970
2912
  removeClass(currentActive, 'active');
2971
2913
  removeAttribute(currentActive, ariaSelected);
@@ -2983,15 +2925,13 @@
2983
2925
 
2984
2926
  /**
2985
2927
  * The `ColorPicker` *touchstart* / *mousedown* events listener for control knobs.
2986
- * @param {TouchEvent} e
2928
+ * @param {PointerEvent} e
2987
2929
  * @this {ColorPicker}
2988
2930
  */
2989
2931
  pointerDown(e) {
2990
2932
  const self = this;
2991
2933
  /** @type {*} */
2992
- const {
2993
- type, target, touches, pageX, pageY,
2994
- } = e;
2934
+ const { target, pageX, pageY } = e;
2995
2935
  const { colorMenu, visuals, controlKnobs } = self;
2996
2936
  const [v1, v2, v3] = visuals;
2997
2937
  const [c1, c2, c3] = controlKnobs;
@@ -2999,11 +2939,10 @@
2999
2939
  const visual = controlKnobs.includes(target) ? target.previousElementSibling : target;
3000
2940
  const visualRect = getBoundingClientRect(visual);
3001
2941
  const html = getDocumentElement(v1);
3002
- const X = type === 'touchstart' ? touches[0].pageX : pageX;
3003
- const Y = type === 'touchstart' ? touches[0].pageY : pageY;
3004
- const offsetX = X - html.scrollLeft - visualRect.left;
3005
- const offsetY = Y - html.scrollTop - visualRect.top;
2942
+ const offsetX = pageX - html.scrollLeft - visualRect.left;
2943
+ const offsetY = pageY - html.scrollTop - visualRect.top;
3006
2944
 
2945
+ /* istanbul ignore else */
3007
2946
  if (target === v1 || target === c1) {
3008
2947
  self.dragElement = visual;
3009
2948
  self.changeControl1(offsetX, offsetY);
@@ -3027,7 +2966,7 @@
3027
2966
 
3028
2967
  /**
3029
2968
  * The `ColorPicker` *touchend* / *mouseup* events listener for control knobs.
3030
- * @param {TouchEvent} e
2969
+ * @param {PointerEvent} e
3031
2970
  * @this {ColorPicker}
3032
2971
  */
3033
2972
  pointerUp({ target }) {
@@ -3036,9 +2975,8 @@
3036
2975
  const doc = getDocument(parent);
3037
2976
  const currentOpen = querySelector(`${colorPickerParentSelector}.open`, doc) !== null;
3038
2977
  const selection = doc.getSelection();
3039
- // @ts-ignore
2978
+
3040
2979
  if (!self.dragElement && !selection.toString().length
3041
- // @ts-ignore
3042
2980
  && !parent.contains(target)) {
3043
2981
  self.hide(currentOpen);
3044
2982
  }
@@ -3048,25 +2986,20 @@
3048
2986
 
3049
2987
  /**
3050
2988
  * The `ColorPicker` *touchmove* / *mousemove* events listener for control knobs.
3051
- * @param {TouchEvent} e
2989
+ * @param {PointerEvent} e
3052
2990
  */
3053
2991
  pointerMove(e) {
3054
2992
  const self = this;
3055
2993
  const { dragElement, visuals } = self;
3056
2994
  const [v1, v2, v3] = visuals;
3057
- const {
3058
- // @ts-ignore
3059
- type, touches, pageX, pageY,
3060
- } = e;
2995
+ const { pageX, pageY } = e;
3061
2996
 
3062
2997
  if (!dragElement) return;
3063
2998
 
3064
2999
  const controlRect = getBoundingClientRect(dragElement);
3065
3000
  const win = getDocumentElement(v1);
3066
- const X = type === touchmoveEvent ? touches[0].pageX : pageX;
3067
- const Y = type === touchmoveEvent ? touches[0].pageY : pageY;
3068
- const offsetX = X - win.scrollLeft - controlRect.left;
3069
- const offsetY = Y - win.scrollTop - controlRect.top;
3001
+ const offsetX = pageX - win.scrollLeft - controlRect.left;
3002
+ const offsetY = pageY - win.scrollTop - controlRect.top;
3070
3003
 
3071
3004
  if (dragElement === v1) {
3072
3005
  self.changeControl1(offsetX, offsetY);
@@ -3100,13 +3033,16 @@
3100
3033
  const currentKnob = controlKnobs.find((x) => x === activeElement);
3101
3034
  const yRatio = offsetHeight / 360;
3102
3035
 
3036
+ /* istanbul ignore else */
3103
3037
  if (currentKnob) {
3104
3038
  let offsetX = 0;
3105
3039
  let offsetY = 0;
3106
3040
 
3041
+ /* istanbul ignore else */
3107
3042
  if (target === c1) {
3108
3043
  const xRatio = offsetWidth / 100;
3109
3044
 
3045
+ /* istanbul ignore else */
3110
3046
  if ([keyArrowLeft, keyArrowRight].includes(code)) {
3111
3047
  self.controlPositions.c1x += code === keyArrowRight ? xRatio : -xRatio;
3112
3048
  } else if ([keyArrowUp, keyArrowDown].includes(code)) {
@@ -3152,6 +3088,7 @@
3152
3088
  const isNonColorValue = self.hasNonColor && nonColors.includes(currentValue);
3153
3089
  const alpha = i4 ? v4 : (1 - controlPositions.c3y / offsetHeight);
3154
3090
 
3091
+ /* istanbul ignore else */
3155
3092
  if (activeElement === input || (activeElement && inputs.includes(activeElement))) {
3156
3093
  if (activeElement === input) {
3157
3094
  if (isNonColorValue) {
@@ -3466,6 +3403,7 @@
3466
3403
  const hue = roundPart(hsl.h * 360);
3467
3404
  let newColor;
3468
3405
 
3406
+ /* istanbul ignore else */
3469
3407
  if (format === 'hex') {
3470
3408
  newColor = self.color.toHexString(true);
3471
3409
  i1.value = self.hex;
@@ -3566,15 +3504,15 @@
3566
3504
  const relatedBtn = openPicker ? pickerToggle : menuToggle;
3567
3505
  const animationDuration = openDropdown && getElementTransitionDuration(openDropdown);
3568
3506
 
3569
- // if (!self.isValid) {
3570
3507
  self.value = self.color.toString(true);
3571
- // }
3572
3508
 
3509
+ /* istanbul ignore else */
3573
3510
  if (openDropdown) {
3574
3511
  removeClass(openDropdown, 'show');
3575
3512
  setAttribute(relatedBtn, ariaExpanded, 'false');
3576
3513
  setTimeout(() => {
3577
3514
  removePosition(openDropdown);
3515
+ /* istanbul ignore else */
3578
3516
  if (!querySelector('.show', parent)) {
3579
3517
  removeClass(parent, 'open');
3580
3518
  toggleEventsOnShown(self);
@@ -3587,7 +3525,7 @@
3587
3525
  focus(pickerToggle);
3588
3526
  }
3589
3527
  setAttribute(input, tabIndex, '-1');
3590
- if (menuToggle) {
3528
+ if (relatedBtn === menuToggle) {
3591
3529
  setAttribute(menuToggle, tabIndex, '-1');
3592
3530
  }
3593
3531
  }
@@ -3625,6 +3563,11 @@
3625
3563
  getBoundingClientRect,
3626
3564
  });
3627
3565
 
3566
+ /**
3567
+ * A single import is required to add the `CP` namespace to `src` sources.
3568
+ * @typedef {import("../../types/index")}
3569
+ */
3570
+
3628
3571
  return ColorPicker;
3629
3572
 
3630
3573
  }));