@thednp/color-picker 1.0.1 → 2.0.0-alpha1
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.cjs +199 -0
- package/.lgtm.yml +9 -0
- package/.prettierrc.json +15 -0
- package/.stylelintrc.json +236 -0
- package/LICENSE +0 -0
- package/README.md +54 -72
- package/compile.js +48 -0
- package/cypress/downloads/downloads.htm +0 -0
- package/cypress/e2e/color-palette.cy.ts +128 -0
- package/cypress/e2e/color-picker.cy.ts +920 -0
- package/cypress/fixtures/colorNamesFrench.js +3 -0
- package/cypress/fixtures/componentLabelsFrench.js +21 -0
- package/cypress/fixtures/format.js +3 -0
- package/cypress/fixtures/getCEMarkup.js +29 -0
- package/cypress/fixtures/getMarkup.js +28 -0
- package/cypress/fixtures/getRandomInt.js +6 -0
- package/cypress/fixtures/sampleWebcolors.js +18 -0
- package/cypress/fixtures/testSample.js +8 -0
- package/cypress/plugins/esbuild-istanbul.ts +50 -0
- package/cypress/plugins/tsCompile.ts +34 -0
- package/cypress/support/commands.ts +0 -0
- package/cypress/support/e2e.ts +21 -0
- package/cypress/test.html +23 -0
- package/cypress.config.ts +29 -0
- package/dist/css/color-picker.css +14 -38
- package/dist/css/color-picker.min.css +2 -2
- package/dist/css/color-picker.rtl.css +14 -38
- package/dist/css/color-picker.rtl.min.css +2 -2
- package/dist/js/color-picker.cjs +8 -0
- package/dist/js/color-picker.cjs.map +1 -0
- package/dist/js/color-picker.d.ts +278 -0
- package/dist/js/color-picker.js +5 -3570
- package/dist/js/color-picker.js.map +1 -0
- package/dist/js/color-picker.mjs +2631 -0
- package/dist/js/color-picker.mjs.map +1 -0
- package/dts.config.ts +15 -0
- package/package.json +64 -74
- package/src/scss/_variables.scss +0 -1
- package/src/scss/color-picker.rtl.scss +4 -0
- package/src/scss/color-picker.scss +74 -38
- package/src/ts/colorPalette.ts +89 -0
- package/src/{js/color-picker.js → ts/index.ts} +489 -486
- package/src/ts/interface/colorPickerLabels.ts +20 -0
- package/src/ts/interface/colorPickerOptions.ts +11 -0
- package/src/ts/interface/paletteOptions.ts +6 -0
- package/src/ts/util/colorNames.ts +21 -0
- package/src/{js/util/colorPickerLabels.js → ts/util/colorPickerLabels.ts} +4 -2
- package/src/ts/util/getColorControls.ts +90 -0
- package/src/{js/util/getColorForm.js → ts/util/getColorForm.ts} +28 -18
- package/src/{js/util/getColorMenu.js → ts/util/getColorMenu.ts} +21 -30
- package/src/ts/util/isValidJSON.ts +19 -0
- package/src/{js/util/setMarkup.js → ts/util/setMarkup.ts} +57 -48
- package/src/{js/util/vHidden.js → ts/util/vHidden.ts} +0 -0
- package/tsconfig.json +29 -0
- package/vite.config.ts +34 -0
- package/dist/js/color-esm.js +0 -1164
- package/dist/js/color-esm.min.js +0 -2
- package/dist/js/color-palette-esm.js +0 -1235
- package/dist/js/color-palette-esm.min.js +0 -2
- package/dist/js/color-palette.js +0 -1243
- package/dist/js/color-palette.min.js +0 -2
- package/dist/js/color-picker-element-esm.js +0 -3718
- package/dist/js/color-picker-element-esm.min.js +0 -2
- package/dist/js/color-picker-element.js +0 -3726
- package/dist/js/color-picker-element.min.js +0 -2
- package/dist/js/color-picker-esm.js +0 -3565
- package/dist/js/color-picker-esm.min.js +0 -2
- package/dist/js/color-picker.min.js +0 -2
- package/dist/js/color.js +0 -1172
- package/dist/js/color.min.js +0 -2
- package/src/js/color-palette.js +0 -75
- package/src/js/color-picker-element.js +0 -107
- package/src/js/color.js +0 -1104
- package/src/js/index.js +0 -8
- package/src/js/util/colorNames.js +0 -6
- package/src/js/util/getColorControls.js +0 -103
- package/src/js/util/isValidJSON.js +0 -13
- package/src/js/util/nonColors.js +0 -5
- package/src/js/util/roundPart.js +0 -9
- package/src/js/util/setCSSProperties.js +0 -12
- package/src/js/util/tabindex.js +0 -3
- package/src/js/util/toggleCEAttr.js +0 -70
- package/src/js/util/version.js +0 -5
- package/src/js/version.js +0 -5
- package/types/cp.d.ts +0 -558
- package/types/index.d.ts +0 -44
- package/types/source/source.ts +0 -4
- package/types/source/types.d.ts +0 -92
@@ -0,0 +1,20 @@
|
|
1
|
+
export default interface ColorPickerLabels {
|
2
|
+
pickerLabel: string;
|
3
|
+
appearanceLabel: string;
|
4
|
+
valueLabel: string;
|
5
|
+
toggleLabel: string;
|
6
|
+
presetsLabel: string;
|
7
|
+
defaultsLabel: string;
|
8
|
+
formatLabel: string;
|
9
|
+
alphaLabel: string;
|
10
|
+
hexLabel: string;
|
11
|
+
hueLabel: string;
|
12
|
+
whitenessLabel: string;
|
13
|
+
blacknessLabel: string;
|
14
|
+
saturationLabel: string;
|
15
|
+
lightnessLabel: string;
|
16
|
+
redLabel: string;
|
17
|
+
greenLabel: string;
|
18
|
+
blueLabel: string;
|
19
|
+
[key: string]: string;
|
20
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import type { ColorFormats } from '@thednp/color';
|
2
|
+
import ColorPickerLabels from './colorPickerLabels';
|
3
|
+
import ColorPalette from '../colorPalette';
|
4
|
+
|
5
|
+
export default interface ColorPickerOptions {
|
6
|
+
colorLabels: string | string[];
|
7
|
+
componentLabels: ColorPickerLabels;
|
8
|
+
format: ColorFormats;
|
9
|
+
colorPresets: string | string[] | ColorPalette | false;
|
10
|
+
colorKeywords: string | string[] | false;
|
11
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
/** A list of 17 color names used for WAI-ARIA compliance. */
|
2
|
+
const colorNames: string[] = [
|
3
|
+
'white',
|
4
|
+
'black',
|
5
|
+
'grey',
|
6
|
+
'red',
|
7
|
+
'orange',
|
8
|
+
'brown',
|
9
|
+
'gold',
|
10
|
+
'olive',
|
11
|
+
'yellow',
|
12
|
+
'lime',
|
13
|
+
'green',
|
14
|
+
'teal',
|
15
|
+
'cyan',
|
16
|
+
'blue',
|
17
|
+
'violet',
|
18
|
+
'magenta',
|
19
|
+
'pink',
|
20
|
+
];
|
21
|
+
export default colorNames;
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import ColorPickerLabels from '../interface/colorPickerLabels';
|
2
|
+
|
3
|
+
/** The labels presented to the user. */
|
4
|
+
const colorPickerLabels: ColorPickerLabels = {
|
3
5
|
pickerLabel: 'Colour Picker',
|
4
6
|
appearanceLabel: 'Colour Appearance',
|
5
7
|
valueLabel: 'Colour Value',
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import { createElement } from '@thednp/shorty';
|
2
|
+
|
3
|
+
import ColorPicker from '..';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Returns all color controls for `ColorPicker`.
|
7
|
+
*
|
8
|
+
* @param self the `ColorPicker` instance
|
9
|
+
* @returns color controls
|
10
|
+
*/
|
11
|
+
const getColorControls = (self: ColorPicker): HTMLElement => {
|
12
|
+
const { format, componentLabels } = self;
|
13
|
+
const { hueLabel, alphaLabel, lightnessLabel, saturationLabel, whitenessLabel, blacknessLabel } = componentLabels;
|
14
|
+
|
15
|
+
const max1 = format === 'hsl' ? 360 : 100;
|
16
|
+
const max2 = format === 'hsl' ? 100 : 360;
|
17
|
+
const max3 = 100;
|
18
|
+
|
19
|
+
let ctrl1Label = format === 'hsl' ? `${hueLabel} & ${lightnessLabel}` : `${lightnessLabel} & ${saturationLabel}`;
|
20
|
+
|
21
|
+
ctrl1Label = format === 'hwb' ? `${whitenessLabel} & ${blacknessLabel}` : ctrl1Label;
|
22
|
+
|
23
|
+
const ctrl2Label = format === 'hsl' ? `${saturationLabel}` : `${hueLabel}`;
|
24
|
+
|
25
|
+
const colorControls = createElement({
|
26
|
+
tagName: 'div',
|
27
|
+
className: `color-controls ${format}`,
|
28
|
+
}) as HTMLElement;
|
29
|
+
|
30
|
+
const colorPointer = 'color-pointer';
|
31
|
+
const colorSlider = 'color-slider';
|
32
|
+
|
33
|
+
const controls = [
|
34
|
+
{
|
35
|
+
i: 1,
|
36
|
+
c: colorPointer,
|
37
|
+
l: ctrl1Label,
|
38
|
+
min: 0,
|
39
|
+
max: max1,
|
40
|
+
},
|
41
|
+
{
|
42
|
+
i: 2,
|
43
|
+
c: colorSlider,
|
44
|
+
l: ctrl2Label,
|
45
|
+
min: 0,
|
46
|
+
max: max2,
|
47
|
+
},
|
48
|
+
{
|
49
|
+
i: 3,
|
50
|
+
c: colorSlider,
|
51
|
+
l: alphaLabel,
|
52
|
+
min: 0,
|
53
|
+
max: max3,
|
54
|
+
},
|
55
|
+
];
|
56
|
+
|
57
|
+
controls.forEach(template => {
|
58
|
+
const { i, c, l, min, max } = template;
|
59
|
+
const control = createElement({
|
60
|
+
tagName: 'div',
|
61
|
+
className: 'color-control',
|
62
|
+
role: 'presentation',
|
63
|
+
}) as HTMLElement;
|
64
|
+
|
65
|
+
control.append(
|
66
|
+
createElement({
|
67
|
+
tagName: 'div',
|
68
|
+
className: `visual-control visual-control${i}`,
|
69
|
+
}) as HTMLElement,
|
70
|
+
);
|
71
|
+
|
72
|
+
const knob = createElement({
|
73
|
+
tagName: 'div',
|
74
|
+
className: `${c} knob`,
|
75
|
+
ariaLive: 'polite',
|
76
|
+
ariaLabel: l,
|
77
|
+
role: 'slider',
|
78
|
+
tabIndex: 0,
|
79
|
+
ariaValueMin: `${min}`,
|
80
|
+
ariaValueMax: `${max}`,
|
81
|
+
}) as HTMLElement;
|
82
|
+
|
83
|
+
control.append(knob);
|
84
|
+
colorControls.append(control);
|
85
|
+
});
|
86
|
+
|
87
|
+
return colorControls;
|
88
|
+
};
|
89
|
+
|
90
|
+
export default getColorControls;
|
@@ -1,37 +1,43 @@
|
|
1
|
-
import createElement from '
|
2
|
-
import setAttribute from 'shorter-js/src/attr/setAttribute';
|
3
|
-
import ObjectAssign from 'shorter-js/src/misc/ObjectAssign';
|
4
|
-
import toUpperCase from 'shorter-js/src/misc/toUpperCase';
|
1
|
+
import { createElement, setAttribute, ObjectAssign, toUpperCase } from '@thednp/shorty';
|
5
2
|
|
6
3
|
import vHidden from './vHidden';
|
4
|
+
import ColorPicker from '../index';
|
7
5
|
|
8
6
|
/**
|
9
7
|
* Returns the color form for `ColorPicker`.
|
10
8
|
*
|
11
|
-
* @param
|
12
|
-
* @returns
|
9
|
+
* @param self the `ColorPicker` instance
|
10
|
+
* @returns a new `<div>` element with color component `<input>`
|
13
11
|
*/
|
14
|
-
|
12
|
+
const getColorForm = (self: ColorPicker): HTMLElement => {
|
15
13
|
const { format, id, componentLabels } = self;
|
16
14
|
const colorForm = createElement({
|
17
15
|
tagName: 'div',
|
18
16
|
className: `color-form ${format}`,
|
19
|
-
});
|
17
|
+
}) as HTMLElement;
|
20
18
|
|
21
19
|
let components = ['hex'];
|
22
20
|
if (format === 'rgb') components = ['red', 'green', 'blue', 'alpha'];
|
23
21
|
else if (format === 'hsl') components = ['hue', 'saturation', 'lightness', 'alpha'];
|
24
22
|
else if (format === 'hwb') components = ['hue', 'whiteness', 'blackness', 'alpha'];
|
25
23
|
|
26
|
-
components.forEach((c) => {
|
24
|
+
components.forEach((c: string): void => {
|
27
25
|
const [C] = format === 'hex' ? ['#'] : toUpperCase(c).split('');
|
28
26
|
const cID = `color_${format}_${c}_${id}`;
|
29
27
|
const formatLabel = componentLabels[`${c}Label`];
|
30
|
-
const cInputLabel = createElement({ tagName: 'label' });
|
28
|
+
const cInputLabel = createElement({ tagName: 'label' }) as HTMLElement;
|
31
29
|
setAttribute(cInputLabel, 'for', cID);
|
32
30
|
cInputLabel.append(
|
33
|
-
createElement({
|
34
|
-
|
31
|
+
createElement({
|
32
|
+
tagName: 'span',
|
33
|
+
ariaHidden: 'true',
|
34
|
+
innerText: `${C}:`,
|
35
|
+
}) as HTMLElement,
|
36
|
+
createElement({
|
37
|
+
tagName: 'span',
|
38
|
+
className: vHidden,
|
39
|
+
innerText: formatLabel,
|
40
|
+
}) as HTMLElement,
|
35
41
|
);
|
36
42
|
const cInput = createElement({
|
37
43
|
tagName: 'input',
|
@@ -40,18 +46,20 @@ export default function getColorForm(self) {
|
|
40
46
|
type: format === 'hex' ? 'text' : 'number',
|
41
47
|
value: c === 'alpha' ? '100' : '0',
|
42
48
|
className: `color-input ${c}`,
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
autocomplete: 'off',
|
50
|
+
spellcheck: false,
|
51
|
+
} as Partial<HTMLInputElement>) as HTMLInputElement;
|
46
52
|
|
47
53
|
// alpha
|
48
54
|
let max = '100';
|
49
55
|
let step = '1';
|
50
56
|
if (c !== 'alpha') {
|
51
57
|
if (format === 'rgb') {
|
52
|
-
max = '255';
|
58
|
+
max = '255';
|
59
|
+
step = '1';
|
53
60
|
} else if (c === 'hue') {
|
54
|
-
max = '360';
|
61
|
+
max = '360';
|
62
|
+
step = '1';
|
55
63
|
}
|
56
64
|
}
|
57
65
|
ObjectAssign(cInput, {
|
@@ -62,4 +70,6 @@ export default function getColorForm(self) {
|
|
62
70
|
colorForm.append(cInputLabel, cInput);
|
63
71
|
});
|
64
72
|
return colorForm;
|
65
|
-
}
|
73
|
+
};
|
74
|
+
|
75
|
+
export default getColorForm;
|
@@ -1,23 +1,13 @@
|
|
1
|
-
import
|
2
|
-
import ariaSelected from 'shorter-js/src/strings/ariaSelected';
|
3
|
-
import setAttribute from 'shorter-js/src/attr/setAttribute';
|
4
|
-
import getAttribute from 'shorter-js/src/attr/getAttribute';
|
5
|
-
import createElement from 'shorter-js/src/misc/createElement';
|
6
|
-
import setElementStyle from 'shorter-js/src/misc/setElementStyle';
|
1
|
+
import { setAttribute, getAttribute, createElement, setElementStyle } from '@thednp/shorty';
|
7
2
|
|
8
|
-
import
|
9
|
-
import
|
10
|
-
import
|
11
|
-
import ColorPalette from '../color-palette';
|
3
|
+
import Color from '@thednp/color';
|
4
|
+
import ColorPalette from '../colorPalette';
|
5
|
+
import ColorPicker from '../index';
|
12
6
|
|
13
7
|
/**
|
14
8
|
* Returns a color-defaults with given values and class.
|
15
|
-
* @param {CP.ColorPicker} self
|
16
|
-
* @param {CP.ColorPalette | string[]} colorsSource
|
17
|
-
* @param {string} menuClass
|
18
|
-
* @returns {HTMLElement | Element}
|
19
9
|
*/
|
20
|
-
|
10
|
+
const getColorMenu = (self: ColorPicker, colorsSource: ColorPalette | string[], menuClass: string): HTMLElement => {
|
21
11
|
const { input, format, componentLabels } = self;
|
22
12
|
const { defaultsLabel, presetsLabel } = componentLabels;
|
23
13
|
const isOptionsMenu = menuClass === 'color-options';
|
@@ -26,7 +16,7 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
26
16
|
const colorsArray = isPalette ? colorsSource.colors : colorsSource;
|
27
17
|
const colorsCount = colorsArray.length;
|
28
18
|
const { lightSteps } = isPalette ? colorsSource : { lightSteps: null };
|
29
|
-
const fit = lightSteps || [9, 10].find(
|
19
|
+
const fit = lightSteps || [9, 10].find(x => colorsCount >= x * 2 && !(colorsCount % x)) || 5;
|
30
20
|
const isMultiLine = isOptionsMenu && colorsCount > fit;
|
31
21
|
let rowCountHover = 2;
|
32
22
|
rowCountHover = isMultiLine && colorsCount > fit * 2 ? 3 : rowCountHover;
|
@@ -42,26 +32,26 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
42
32
|
optionSize = fit > 5 && isMultiLine ? 1.5 : optionSize;
|
43
33
|
const menuHeight = `${rowCount * optionSize}rem`;
|
44
34
|
const menuHeightHover = `calc(${rowCountHover} * ${optionSize}rem + ${rowCountHover - 1} * ${gap})`;
|
45
|
-
|
46
|
-
//
|
35
|
+
|
36
|
+
// <UL> is an `HTMLElement`
|
47
37
|
const menu = createElement({
|
48
38
|
tagName: 'ul',
|
49
39
|
className: finalClass,
|
50
|
-
|
51
|
-
|
52
|
-
|
40
|
+
role: 'listbox',
|
41
|
+
ariaLabel: menuLabel,
|
42
|
+
}) as HTMLElement;
|
53
43
|
|
54
44
|
if (isScrollable) {
|
55
|
-
|
45
|
+
setElementStyle(menu, {
|
56
46
|
'--grid-item-size': `${optionSize}rem`,
|
57
|
-
'--grid-fit': fit
|
47
|
+
'--grid-fit': `${fit}`,
|
58
48
|
'--grid-gap': gap,
|
59
49
|
'--grid-height': menuHeight,
|
60
50
|
'--grid-hover-height': menuHeightHover,
|
61
51
|
});
|
62
52
|
}
|
63
53
|
|
64
|
-
colorsArray.forEach(
|
54
|
+
colorsArray.forEach(x => {
|
65
55
|
let [value, label] = typeof x === 'string' ? x.trim().split(':') : [];
|
66
56
|
if (x instanceof Color) {
|
67
57
|
value = x.toHexString();
|
@@ -75,12 +65,11 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
75
65
|
tagName: 'li',
|
76
66
|
className: `color-option${active}`,
|
77
67
|
innerText: `${label || value}`,
|
78
|
-
|
79
|
-
|
80
|
-
|
68
|
+
tabIndex: 0,
|
69
|
+
role: 'option',
|
70
|
+
ariaSelected: isActive ? 'true' : 'false',
|
71
|
+
}) as HTMLElement;
|
81
72
|
setAttribute(option, 'data-value', `${value}`);
|
82
|
-
setAttribute(option, 'role', 'option');
|
83
|
-
setAttribute(option, ariaSelected, isActive ? 'true' : 'false');
|
84
73
|
|
85
74
|
if (isOptionsMenu) {
|
86
75
|
setElementStyle(option, { backgroundColor: value });
|
@@ -89,4 +78,6 @@ export default function getColorMenu(self, colorsSource, menuClass) {
|
|
89
78
|
menu.append(option);
|
90
79
|
});
|
91
80
|
return menu;
|
92
|
-
}
|
81
|
+
};
|
82
|
+
|
83
|
+
export default getColorMenu;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { isString } from '@thednp/shorty';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Check if a string is valid JSON string.
|
5
|
+
*
|
6
|
+
* @param str the string input
|
7
|
+
* @returns the query result
|
8
|
+
*/
|
9
|
+
const isValidJSON = (str: unknown): str is string => {
|
10
|
+
if (!isString(str)) return false;
|
11
|
+
try {
|
12
|
+
JSON.parse(str);
|
13
|
+
} catch (e) {
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
return true;
|
17
|
+
};
|
18
|
+
|
19
|
+
export default isValidJSON;
|
@@ -1,36 +1,33 @@
|
|
1
|
-
import
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
import {
|
2
|
+
getAttribute,
|
3
|
+
setAttribute,
|
4
|
+
toUpperCase,
|
5
|
+
ariaHidden,
|
6
|
+
tabindex,
|
7
|
+
createElement,
|
8
|
+
createElementNS,
|
9
|
+
} from '@thednp/shorty';
|
10
|
+
|
11
|
+
import Color from '@thednp/color';
|
11
12
|
|
12
13
|
import getColorForm from './getColorForm';
|
13
14
|
import getColorControls from './getColorControls';
|
14
15
|
import getColorMenu from './getColorMenu';
|
15
|
-
import nonColors from './nonColors';
|
16
16
|
import vHidden from './vHidden';
|
17
|
-
import tabIndex from './tabindex';
|
18
17
|
|
19
|
-
import
|
18
|
+
import ColorPicker from '../index';
|
20
19
|
|
21
20
|
/**
|
22
|
-
* Generate HTML markup and update instance properties.
|
23
|
-
*
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
} = self;
|
21
|
+
* Generate HTML markup and update instance properties.
|
22
|
+
*
|
23
|
+
* @param self
|
24
|
+
*/
|
25
|
+
const setMarkup = (self: ColorPicker) => {
|
26
|
+
const { input, parent, format, id, componentLabels, colorKeywords, colorPresets } = self;
|
29
27
|
const colorValue = getAttribute(input, 'value') || '#fff';
|
28
|
+
const { nonColors } = Color;
|
30
29
|
|
31
|
-
const {
|
32
|
-
toggleLabel, pickerLabel, formatLabel, hexLabel,
|
33
|
-
} = componentLabels;
|
30
|
+
const { toggleLabel, pickerLabel, formatLabel, hexLabel } = componentLabels;
|
34
31
|
|
35
32
|
// update color
|
36
33
|
const color = nonColors.includes(colorValue) ? '#fff' : colorValue;
|
@@ -43,21 +40,24 @@ export default function setMarkup(self) {
|
|
43
40
|
id: `picker-btn-${id}`,
|
44
41
|
tagName: 'button',
|
45
42
|
className: 'picker-toggle btn-appearance',
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
43
|
+
ariaExpanded: 'false',
|
44
|
+
ariaHasPopup: 'true',
|
45
|
+
}) as HTMLElement;
|
46
|
+
|
47
|
+
pickerBtn.append(
|
48
|
+
createElement({
|
49
|
+
tagName: 'span',
|
50
|
+
className: vHidden,
|
51
|
+
innerText: `${pickerLabel}. ${formatLabel}: ${formatString}`,
|
52
|
+
}) as HTMLElement,
|
53
|
+
);
|
54
54
|
|
55
55
|
const pickerDropdown = createElement({
|
56
56
|
tagName: 'div',
|
57
57
|
className: 'color-dropdown picker',
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
role: 'group',
|
59
|
+
ariaLabelledBy: `picker-btn-${id}`,
|
60
|
+
} as Partial<HTMLElement> & { ariaLabelledBy: string }) as HTMLElement;
|
61
61
|
|
62
62
|
const colorControls = getColorControls(self);
|
63
63
|
const colorForm = getColorForm(self);
|
@@ -71,7 +71,7 @@ export default function setMarkup(self) {
|
|
71
71
|
const presetsDropdown = createElement({
|
72
72
|
tagName: 'div',
|
73
73
|
className: 'color-dropdown scrollable menu',
|
74
|
-
});
|
74
|
+
}) as HTMLElement;
|
75
75
|
|
76
76
|
// color presets
|
77
77
|
if (colorPresets) {
|
@@ -87,26 +87,33 @@ export default function setMarkup(self) {
|
|
87
87
|
const presetsBtn = createElement({
|
88
88
|
tagName: 'button',
|
89
89
|
className: 'menu-toggle btn-appearance',
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
tabIndex: -1,
|
91
|
+
ariaExpanded: 'false',
|
92
|
+
ariaHasPopup: 'true',
|
93
|
+
}) as HTMLElement;
|
94
94
|
|
95
95
|
const xmlns = encodeURI('http://www.w3.org/2000/svg');
|
96
|
-
const presetsIcon = createElementNS(xmlns, {
|
96
|
+
const presetsIcon = createElementNS(xmlns, {
|
97
|
+
tagName: 'svg',
|
98
|
+
}) as HTMLElement;
|
97
99
|
setAttribute(presetsIcon, 'xmlns', xmlns);
|
98
100
|
setAttribute(presetsIcon, 'viewBox', '0 0 512 512');
|
99
101
|
setAttribute(presetsIcon, ariaHidden, 'true');
|
100
102
|
|
101
|
-
const path = createElementNS(xmlns, {
|
103
|
+
const path = createElementNS(xmlns, {
|
104
|
+
tagName: 'path',
|
105
|
+
}) as HTMLElement;
|
102
106
|
setAttribute(path, 'd', 'M98,158l157,156L411,158l27,27L255,368L71,185L98,158z');
|
103
107
|
setAttribute(path, 'fill', '#fff');
|
104
108
|
presetsIcon.append(path);
|
105
|
-
presetsBtn.append(
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
presetsBtn.append(
|
110
|
+
createElement({
|
111
|
+
tagName: 'span',
|
112
|
+
className: vHidden,
|
113
|
+
innerText: `${toggleLabel}`,
|
114
|
+
}) as HTMLElement,
|
115
|
+
presetsIcon,
|
116
|
+
);
|
110
117
|
|
111
118
|
parent.append(presetsBtn, presetsDropdown);
|
112
119
|
}
|
@@ -115,5 +122,7 @@ export default function setMarkup(self) {
|
|
115
122
|
if (colorKeywords && nonColors.includes(colorValue)) {
|
116
123
|
self.value = colorValue;
|
117
124
|
}
|
118
|
-
setAttribute(input,
|
119
|
-
}
|
125
|
+
setAttribute(input, tabindex, '-1');
|
126
|
+
};
|
127
|
+
|
128
|
+
export default setMarkup;
|
File without changes
|
package/tsconfig.json
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
{
|
2
|
+
// https://janessagarrow.com/blog/typescript-and-esbuild/
|
3
|
+
"compilerOptions": {
|
4
|
+
"lib": ["DOM", "ESNext", "DOM.Iterable"],
|
5
|
+
"types": ["vite", "vite/client", "cypress", "@thednp/shorty", "@thednp/event-listener", "@thednp/color"],
|
6
|
+
"rootDir": "./",
|
7
|
+
"baseUrl": "./",
|
8
|
+
"module": "ESNext",
|
9
|
+
"target": "ESNext",
|
10
|
+
"moduleResolution": "Node",
|
11
|
+
"allowJs": true,
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
13
|
+
"useDefineForClassFields": true,
|
14
|
+
"strict": true,
|
15
|
+
"sourceMap": true,
|
16
|
+
"resolveJsonModule": true,
|
17
|
+
"esModuleInterop": true,
|
18
|
+
"isolatedModules": true,
|
19
|
+
"noUnusedLocals": true,
|
20
|
+
"noUnusedParameters": true,
|
21
|
+
"noImplicitReturns": true,
|
22
|
+
"removeComments": false,
|
23
|
+
"allowSyntheticDefaultImports": true,
|
24
|
+
"noEmit": true,
|
25
|
+
"skipLibCheck": true // allows dts-bundle-generator to import from package.json
|
26
|
+
},
|
27
|
+
"include": ["src/*", "src/**/*"],
|
28
|
+
"exclude": ["node_modules", "experiments", "coverage", "dist"],
|
29
|
+
}
|
package/vite.config.ts
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
import { resolve } from 'path';
|
3
|
+
import { defineConfig } from 'vite';
|
4
|
+
import { name } from './package.json';
|
5
|
+
|
6
|
+
const getPackageName = () => {
|
7
|
+
return name.includes('@') ? name.split('/')[1] : name;
|
8
|
+
};
|
9
|
+
|
10
|
+
const NAME = 'ColorPicker';
|
11
|
+
|
12
|
+
const fileName = {
|
13
|
+
es: `${getPackageName()}.mjs`,
|
14
|
+
cjs: `${getPackageName()}.cjs`,
|
15
|
+
iife: `${getPackageName()}.js`,
|
16
|
+
};
|
17
|
+
|
18
|
+
export default defineConfig({
|
19
|
+
base: './',
|
20
|
+
build: {
|
21
|
+
emptyOutDir: true,
|
22
|
+
outDir: 'dist/js',
|
23
|
+
lib: {
|
24
|
+
entry: resolve(__dirname, 'src/ts/index.ts'),
|
25
|
+
name: NAME,
|
26
|
+
formats: ['es', 'cjs', 'iife'],
|
27
|
+
fileName: (format: string) => fileName[format],
|
28
|
+
},
|
29
|
+
target: 'ESNext',
|
30
|
+
sourcemap: true,
|
31
|
+
minify: true,
|
32
|
+
},
|
33
|
+
});
|
34
|
+
|