@thednp/color-picker 0.0.1 → 0.0.2-alpha3
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +3 -1
- package/dist/css/color-picker.css +1 -1
- package/dist/css/color-picker.min.css +1 -1
- package/dist/css/color-picker.rtl.css +1 -1
- package/dist/css/color-picker.rtl.min.css +1 -1
- package/dist/js/color-esm.js +1167 -0
- package/dist/js/color-esm.min.js +2 -0
- package/dist/js/color-palette-esm.js +1238 -0
- package/dist/js/color-palette-esm.min.js +2 -0
- package/dist/js/color-palette.js +1246 -0
- package/dist/js/color-palette.min.js +2 -0
- package/dist/js/color-picker-element-esm.js +543 -671
- package/dist/js/color-picker-element-esm.min.js +2 -2
- package/dist/js/color-picker-element.js +545 -673
- package/dist/js/color-picker-element.min.js +2 -2
- package/dist/js/color-picker-esm.js +758 -878
- package/dist/js/color-picker-esm.min.js +2 -2
- package/dist/js/color-picker.js +760 -880
- package/dist/js/color-picker.min.js +2 -2
- package/dist/js/color.js +1175 -0
- package/dist/js/color.min.js +2 -0
- package/package.json +22 -3
- package/src/js/color-palette.js +18 -14
- package/src/js/color-picker-element.js +47 -55
- package/src/js/color-picker.js +137 -325
- package/src/js/color.js +169 -185
- package/src/js/util/getColorMenu.js +12 -7
- package/src/js/util/setMarkup.js +122 -0
- package/src/js/util/version.js +6 -0
- package/types/cp.d.ts +64 -32
- package/types/source/types.d.ts +1 -1
- package/src/js/util/templates.js +0 -10
@@ -43,7 +43,8 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
43
43
|
optionSize = fit > 5 && isMultiLine ? 1.5 : optionSize;
|
44
44
|
const menuHeight = `${(rowCount || 1) * optionSize}rem`;
|
45
45
|
const menuHeightHover = `calc(${rowCountHover} * ${optionSize}rem + ${rowCountHover - 1} * ${gap})`;
|
46
|
-
|
46
|
+
/** @type {HTMLUListElement} */
|
47
|
+
// @ts-ignore -- <UL> is an `HTMLElement`
|
47
48
|
const menu = createElement({
|
48
49
|
tagName: 'ul',
|
49
50
|
className: finalClass,
|
@@ -51,7 +52,7 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
51
52
|
setAttribute(menu, 'role', 'listbox');
|
52
53
|
setAttribute(menu, ariaLabel, menuLabel);
|
53
54
|
|
54
|
-
if (isScrollable) {
|
55
|
+
if (isScrollable) {
|
55
56
|
setCSSProperties(menu, {
|
56
57
|
'--grid-item-size': `${optionSize}rem`,
|
57
58
|
'--grid-fit': fit,
|
@@ -62,15 +63,19 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
62
63
|
}
|
63
64
|
|
64
65
|
colorsArray.forEach((x) => {
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
let [value, label] = typeof x === 'string' ? x.trim().split(':') : [];
|
67
|
+
if (x instanceof Color) {
|
68
|
+
value = x.toHexString();
|
69
|
+
label = value;
|
70
|
+
}
|
71
|
+
const color = new Color(x instanceof Color ? x : value, format);
|
72
|
+
const isActive = color.toString() === getAttribute(input, 'value');
|
68
73
|
const active = isActive ? ' active' : '';
|
69
74
|
|
70
75
|
const option = createElement({
|
71
76
|
tagName: 'li',
|
72
77
|
className: `color-option${active}`,
|
73
|
-
innerText: `${label ||
|
78
|
+
innerText: `${label || value}`,
|
74
79
|
});
|
75
80
|
|
76
81
|
setAttribute(option, tabIndex, '0');
|
@@ -79,7 +84,7 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
79
84
|
setAttribute(option, ariaSelected, isActive ? 'true' : 'false');
|
80
85
|
|
81
86
|
if (isOptionsMenu) {
|
82
|
-
setElementStyle(option, { backgroundColor:
|
87
|
+
setElementStyle(option, { backgroundColor: value });
|
83
88
|
}
|
84
89
|
|
85
90
|
menu.append(option);
|
@@ -0,0 +1,122 @@
|
|
1
|
+
import getAttribute from 'shorter-js/src/attr/getAttribute';
|
2
|
+
import setAttribute from 'shorter-js/src/attr/setAttribute';
|
3
|
+
import toUpperCase from 'shorter-js/src/misc/toUpperCase';
|
4
|
+
// import ariaLabel from 'shorter-js/src/strings/ariaLabel';
|
5
|
+
import ariaExpanded from 'shorter-js/src/strings/ariaExpanded';
|
6
|
+
import ariaHasPopup from 'shorter-js/src/strings/ariaHasPopup';
|
7
|
+
import ariaHidden from 'shorter-js/src/strings/ariaHidden';
|
8
|
+
import ariaLabelledBy from 'shorter-js/src/strings/ariaLabelledBy';
|
9
|
+
import createElement from 'shorter-js/src/misc/createElement';
|
10
|
+
import createElementNS from 'shorter-js/src/misc/createElementNS';
|
11
|
+
|
12
|
+
import getColorForm from './getColorForm';
|
13
|
+
import getColorControls from './getColorControls';
|
14
|
+
import getColorMenu from './getColorMenu';
|
15
|
+
import nonColors from './nonColors';
|
16
|
+
import vHidden from './vHidden';
|
17
|
+
import tabIndex from './tabindex';
|
18
|
+
|
19
|
+
import Color from '../color';
|
20
|
+
import ColorPalette from '../color-palette';
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Generate HTML markup and update instance properties.
|
24
|
+
* @param {CP.ColorPicker} self
|
25
|
+
*/
|
26
|
+
export default function setMarkup(self) {
|
27
|
+
const {
|
28
|
+
input, parent, format, id, componentLabels, colorKeywords, colorPresets,
|
29
|
+
} = self;
|
30
|
+
const colorValue = getAttribute(input, 'value') || '#fff';
|
31
|
+
|
32
|
+
const {
|
33
|
+
toggleLabel, pickerLabel, formatLabel, hexLabel,
|
34
|
+
} = componentLabels;
|
35
|
+
|
36
|
+
// update color
|
37
|
+
const color = nonColors.includes(colorValue) ? '#fff' : colorValue;
|
38
|
+
self.color = new Color(color, format);
|
39
|
+
|
40
|
+
// set initial controls dimensions
|
41
|
+
const formatString = format === 'hex' ? hexLabel : toUpperCase(format);
|
42
|
+
|
43
|
+
const pickerBtn = createElement({
|
44
|
+
id: `picker-btn-${id}`,
|
45
|
+
tagName: 'button',
|
46
|
+
className: 'picker-toggle btn-appearance',
|
47
|
+
});
|
48
|
+
setAttribute(pickerBtn, ariaExpanded, 'false');
|
49
|
+
setAttribute(pickerBtn, ariaHasPopup, 'true');
|
50
|
+
pickerBtn.append(createElement({
|
51
|
+
tagName: 'span',
|
52
|
+
className: vHidden,
|
53
|
+
innerText: `${pickerLabel}. ${formatLabel}: ${formatString}`,
|
54
|
+
}));
|
55
|
+
|
56
|
+
const pickerDropdown = createElement({
|
57
|
+
tagName: 'div',
|
58
|
+
className: 'color-dropdown picker',
|
59
|
+
});
|
60
|
+
setAttribute(pickerDropdown, ariaLabelledBy, `picker-btn-${id}`);
|
61
|
+
setAttribute(pickerDropdown, 'role', 'group');
|
62
|
+
|
63
|
+
const colorControls = getColorControls(self);
|
64
|
+
const colorForm = getColorForm(self);
|
65
|
+
|
66
|
+
pickerDropdown.append(colorControls, colorForm);
|
67
|
+
input.before(pickerBtn);
|
68
|
+
parent.append(pickerDropdown);
|
69
|
+
|
70
|
+
// set colour key menu template
|
71
|
+
if (colorKeywords || colorPresets) {
|
72
|
+
const presetsDropdown = createElement({
|
73
|
+
tagName: 'div',
|
74
|
+
className: 'color-dropdown scrollable menu',
|
75
|
+
});
|
76
|
+
|
77
|
+
// color presets
|
78
|
+
if ((colorPresets instanceof Array && colorPresets.length)
|
79
|
+
|| (colorPresets instanceof ColorPalette && colorPresets.colors)) {
|
80
|
+
const presetsMenu = getColorMenu(self, colorPresets, 'color-options');
|
81
|
+
presetsDropdown.append(presetsMenu);
|
82
|
+
}
|
83
|
+
|
84
|
+
// explicit defaults [reset, initial, inherit, transparent, currentColor]
|
85
|
+
if (colorKeywords && colorKeywords.length) {
|
86
|
+
const keywordsMenu = getColorMenu(self, colorKeywords, 'color-defaults');
|
87
|
+
presetsDropdown.append(keywordsMenu);
|
88
|
+
}
|
89
|
+
|
90
|
+
const presetsBtn = createElement({
|
91
|
+
tagName: 'button',
|
92
|
+
className: 'menu-toggle btn-appearance',
|
93
|
+
});
|
94
|
+
setAttribute(presetsBtn, tabIndex, '-1');
|
95
|
+
setAttribute(presetsBtn, ariaExpanded, 'false');
|
96
|
+
setAttribute(presetsBtn, ariaHasPopup, 'true');
|
97
|
+
|
98
|
+
const xmlns = encodeURI('http://www.w3.org/2000/svg');
|
99
|
+
const presetsIcon = createElementNS(xmlns, { tagName: 'svg' });
|
100
|
+
setAttribute(presetsIcon, 'xmlns', xmlns);
|
101
|
+
setAttribute(presetsIcon, 'viewBox', '0 0 512 512');
|
102
|
+
setAttribute(presetsIcon, ariaHidden, 'true');
|
103
|
+
|
104
|
+
const path = createElementNS(xmlns, { tagName: 'path' });
|
105
|
+
setAttribute(path, 'd', 'M98,158l157,156L411,158l27,27L255,368L71,185L98,158z');
|
106
|
+
setAttribute(path, 'fill', '#fff');
|
107
|
+
presetsIcon.append(path);
|
108
|
+
presetsBtn.append(createElement({
|
109
|
+
tagName: 'span',
|
110
|
+
className: vHidden,
|
111
|
+
innerText: `${toggleLabel}`,
|
112
|
+
}), presetsIcon);
|
113
|
+
|
114
|
+
parent.append(presetsBtn, presetsDropdown);
|
115
|
+
}
|
116
|
+
|
117
|
+
// solve non-colors after settings save
|
118
|
+
if (colorKeywords && nonColors.includes(colorValue)) {
|
119
|
+
self.value = colorValue;
|
120
|
+
}
|
121
|
+
setAttribute(input, tabIndex, '-1');
|
122
|
+
}
|
package/types/cp.d.ts
CHANGED
@@ -5,14 +5,21 @@ declare module "color-picker/src/js/util/nonColors" {
|
|
5
5
|
*/
|
6
6
|
const nonColors: string[];
|
7
7
|
}
|
8
|
+
declare module "color-picker/src/js/util/roundPart" {
|
9
|
+
/**
|
10
|
+
* Round colour components, for all formats except HEX.
|
11
|
+
* @param {number} v one of the colour components
|
12
|
+
* @returns {number} the rounded number
|
13
|
+
*/
|
14
|
+
export default function roundPart(v: number): number;
|
15
|
+
}
|
8
16
|
declare module "color-picker/src/js/color" {
|
9
|
-
export default Color;
|
10
17
|
/**
|
11
18
|
* @class
|
12
19
|
* Returns a new `Color` instance.
|
13
20
|
* @see https://github.com/bgrins/TinyColor
|
14
21
|
*/
|
15
|
-
class Color {
|
22
|
+
export default class Color {
|
16
23
|
/**
|
17
24
|
* @constructor
|
18
25
|
* @param {CP.ColorInput} input the given colour value
|
@@ -195,21 +202,21 @@ declare module "color-picker/src/js/color-palette" {
|
|
195
202
|
* Returns a color palette with a given set of parameters.
|
196
203
|
* @example
|
197
204
|
* new ColorPalette(0, 12, 10);
|
198
|
-
* // => { hue: 0, hueSteps: 12, lightSteps: 10, colors:
|
205
|
+
* // => { hue: 0, hueSteps: 12, lightSteps: 10, colors: Array<Color> }
|
199
206
|
*/
|
200
207
|
export default class ColorPalette {
|
201
208
|
/**
|
202
209
|
* The `hue` parameter is optional, which would be set to 0.
|
203
210
|
* @param {number[]} args represeinting hue, hueSteps, lightSteps
|
204
211
|
* * `args.hue` the starting Hue [0, 360]
|
205
|
-
* * `args.hueSteps` Hue Steps Count [5,
|
206
|
-
* * `args.lightSteps` Lightness Steps Count [
|
212
|
+
* * `args.hueSteps` Hue Steps Count [5, 24]
|
213
|
+
* * `args.lightSteps` Lightness Steps Count [5, 12]
|
207
214
|
*/
|
208
215
|
constructor(...args: number[]);
|
209
216
|
hue: number;
|
210
217
|
hueSteps: number;
|
211
218
|
lightSteps: number;
|
212
|
-
colors:
|
219
|
+
colors: any;
|
213
220
|
}
|
214
221
|
}
|
215
222
|
declare module "color-picker/src/js/util/colorPickerLabels" {
|
@@ -225,6 +232,18 @@ declare module "color-picker/src/js/util/colorNames" {
|
|
225
232
|
*/
|
226
233
|
const colorNames: string[];
|
227
234
|
}
|
235
|
+
declare module "color-picker/src/js/util/tabindex" {
|
236
|
+
export default tabIndex;
|
237
|
+
const tabIndex: "tabindex";
|
238
|
+
}
|
239
|
+
declare module "color-picker/src/js/util/isValidJSON" {
|
240
|
+
/**
|
241
|
+
* Check if a string is valid JSON string.
|
242
|
+
* @param {string} str the string input
|
243
|
+
* @returns {boolean} the query result
|
244
|
+
*/
|
245
|
+
export default function isValidJSON(str: string): boolean;
|
246
|
+
}
|
228
247
|
declare module "color-picker/src/js/util/vHidden" {
|
229
248
|
export default vHidden;
|
230
249
|
const vHidden: "v-hidden";
|
@@ -247,6 +266,14 @@ declare module "color-picker/src/js/util/getColorControls" {
|
|
247
266
|
*/
|
248
267
|
export default function getColorControls(self: CP.ColorPicker): HTMLElement | Element;
|
249
268
|
}
|
269
|
+
declare module "color-picker/src/js/util/setCSSProperties" {
|
270
|
+
/**
|
271
|
+
* Helps setting CSS variables to the color-menu.
|
272
|
+
* @param {HTMLElement} element
|
273
|
+
* @param {Record<string,any>} props
|
274
|
+
*/
|
275
|
+
export default function setCSSProperties(element: HTMLElement, props: Record<string, any>): void;
|
276
|
+
}
|
250
277
|
declare module "color-picker/src/js/util/getColorMenu" {
|
251
278
|
/**
|
252
279
|
* Returns a color-defaults with given values and class.
|
@@ -257,15 +284,14 @@ declare module "color-picker/src/js/util/getColorMenu" {
|
|
257
284
|
*/
|
258
285
|
export default function getColorMenu(self: CP.ColorPicker, colorsSource: CP.ColorPalette | string[], menuClass: string): HTMLElement | Element;
|
259
286
|
}
|
260
|
-
declare module "color-picker/src/js/util/
|
287
|
+
declare module "color-picker/src/js/util/setMarkup" {
|
261
288
|
/**
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
export default function isValidJSON(str: string): boolean;
|
289
|
+
* Generate HTML markup and update instance properties.
|
290
|
+
* @param {CP.ColorPicker} self
|
291
|
+
*/
|
292
|
+
export default function setMarkup(self: CP.ColorPicker): void;
|
267
293
|
}
|
268
|
-
declare module "color-picker/src/js/version" {
|
294
|
+
declare module "color-picker/src/js/util/version" {
|
269
295
|
export default Version;
|
270
296
|
const Version: string;
|
271
297
|
}
|
@@ -308,14 +334,24 @@ declare module "color-picker/src/js/color-picker" {
|
|
308
334
|
format: CP.ColorFormats;
|
309
335
|
/** Shows the `ColorPicker` dropdown. */
|
310
336
|
showPicker(): void;
|
337
|
+
/**
|
338
|
+
* The `Space` & `Enter` keys specific event listener.
|
339
|
+
* Toggle visibility of the `ColorPicker` / the presets menu, showing one will hide the other.
|
340
|
+
* @param {KeyboardEvent} e
|
341
|
+
* @this {ColorPicker}
|
342
|
+
*/
|
311
343
|
/**
|
312
344
|
* Toggle the `ColorPicker` dropdown visibility.
|
313
|
-
* @param {Event} e
|
345
|
+
* @param {Event=} e
|
314
346
|
* @this {ColorPicker}
|
315
347
|
*/
|
316
|
-
togglePicker(this: ColorPicker, e
|
317
|
-
/**
|
318
|
-
|
348
|
+
togglePicker(this: ColorPicker, e?: Event | undefined): void;
|
349
|
+
/**
|
350
|
+
* Toggles the visibility of the `ColorPicker` presets menu.
|
351
|
+
* @param {Event=} e
|
352
|
+
* @this {ColorPicker}
|
353
|
+
*/
|
354
|
+
toggleMenu(this: ColorPicker, e?: Event | undefined): void;
|
319
355
|
/**
|
320
356
|
* The `ColorPicker` click event listener for the colour menu presets / defaults.
|
321
357
|
* @param {Partial<Event>} e
|
@@ -371,13 +407,6 @@ declare module "color-picker/src/js/color-picker" {
|
|
371
407
|
* @this {ColorPicker}
|
372
408
|
*/
|
373
409
|
handleDismiss(this: ColorPicker, { code }: KeyboardEvent): void;
|
374
|
-
/**
|
375
|
-
* The `Space` & `Enter` keys specific event listener.
|
376
|
-
* Toggle visibility of the `ColorPicker` / the presets menu, showing one will hide the other.
|
377
|
-
* @param {KeyboardEvent} e
|
378
|
-
* @this {ColorPicker}
|
379
|
-
*/
|
380
|
-
keyToggle(this: ColorPicker, e: KeyboardEvent): void;
|
381
410
|
/**
|
382
411
|
* The `ColorPicker` *keydown* event listener for control knobs.
|
383
412
|
* @param {KeyboardEvent} e
|
@@ -427,6 +456,8 @@ declare module "color-picker/src/js/color-picker" {
|
|
427
456
|
get isDark(): boolean;
|
428
457
|
/** Checks if the current input value is a valid colour. */
|
429
458
|
get isValid(): boolean;
|
459
|
+
/** Returns the colour appearance, usually the closest colour name for the current value. */
|
460
|
+
get appearance(): string | undefined;
|
430
461
|
/** Updates `ColorPicker` visuals. */
|
431
462
|
updateVisuals(): void;
|
432
463
|
/**
|
@@ -482,27 +513,28 @@ declare module "color-picker/src/js/color-picker-element" {
|
|
482
513
|
/**
|
483
514
|
* `ColorPickerElement` Web Component.
|
484
515
|
* @example
|
516
|
+
* <label for="UNIQUE_ID">Label</label>
|
485
517
|
* <color-picker>
|
486
|
-
* <input
|
518
|
+
* <input id="UNIQUE_ID" value="red" format="hex" class="color-preview btn-appearance">
|
487
519
|
* </color-picker>
|
520
|
+
* // or
|
521
|
+
* <label for="UNIQUE_ID">Label</label>
|
522
|
+
* <color-picker data-id="UNIQUE_ID" data-value="red" data-format="hex"></color-picker>
|
488
523
|
*/
|
489
524
|
class ColorPickerElement extends HTMLElement {
|
490
|
-
/** @type {boolean} */
|
491
|
-
isDisconnected: boolean;
|
492
525
|
/**
|
493
526
|
* Returns the current color value.
|
494
|
-
* @returns {string
|
527
|
+
* @returns {string | undefined}
|
495
528
|
*/
|
496
|
-
get value(): string |
|
529
|
+
get value(): string | undefined;
|
497
530
|
connectedCallback(): void;
|
498
531
|
/** @type {HTMLInputElement} */
|
499
532
|
input: HTMLInputElement | undefined;
|
500
533
|
colorPicker: ColorPicker | undefined;
|
501
|
-
|
502
|
-
disconnectedCallback(): void;
|
534
|
+
/** @this {ColorPickerElement} */
|
535
|
+
disconnectedCallback(this: ColorPickerElement): void;
|
503
536
|
}
|
504
537
|
import ColorPicker from "color-picker/src/js/color-picker";
|
505
|
-
import Color from "color-picker/src/js/color";
|
506
538
|
}
|
507
539
|
declare module "color-picker/types/source/source" {
|
508
540
|
export { default as Color } from "color-picker/src/js/color";
|
package/types/source/types.d.ts
CHANGED
@@ -83,7 +83,7 @@ export interface ColorPickerOptions {
|
|
83
83
|
colorKeywords?: string[];
|
84
84
|
}
|
85
85
|
|
86
|
-
export type ColorInput = string |
|
86
|
+
export type ColorInput = string | RGB | RGBA | HSL | HSLA | HSV | HSVA | HWB | ColorObject;
|
87
87
|
export type ColorFormats = string | 'rgb' | 'hex' | 'hex3' | 'hex4' | 'hex6' | 'hex8' | 'hsl' | 'hsv' | 'hwb';
|
88
88
|
|
89
89
|
export type GetInstance<T> = (element: string | HTMLInputElement) => T | null;
|